IDebugErrorBreakpointResolution2::GetResolutionInfo
Gets the breakpoint error resolution information.
Syntax
int GetResolutionInfo(
enum_BPERESI_FIELDS dwFields,
BP_ERROR_RESOLUTION_INFO[] pErrorResolutionInfo
);
Parameters
dwFields
[in] A combination of flags from the BPERESI_FIELDS enumeration that determine which fields of pErrorResolutionInfo
are to be filled out.
pErrorResolutionInfo
[in, out] The BP_ERROR_RESOLUTION_INFO structure that is filled in with the description of the breakpoint resolution.
Return Value
If successful, returns S_OK
; otherwise, returns an error code.
Example
The following example implements this method for a simple CDebugErrorBreakpointResolution
object that exposes the IDebugErrorBreakpointResolution2 interface.
HRESULT CDebugErrorBreakpointResolution::GetResolutionInfo(
BPERESI_FIELDS dwFields,
BP_ERROR_RESOLUTION_INFO* pBPErrorResolutionInfo)
{
HRESULT hr;
if (pBPErrorResolutionInfo)
{
// Copy the specified fields of the request information from the class member
// variable to the local BP_ERROR_RESOLUTION_INFO variable.
hr = CopyBP_ERROR_RESOLUTION_INFO(m_bpErrorResolutionInfo,
*pBPErrorResolutionInfo,
dwFields);
}
else
{
hr = E_INVALIDARG;
}
return hr;
}
HRESULT CDebugErrorBreakpointResolution::CopyBP_ERROR_RESOLUTION_INFO(
BP_ERROR_RESOLUTION_INFO& bpResSrc,
BP_ERROR_RESOLUTION_INFO& bpResDest,
DWORD dwFields)
{
HRESULT hr = S_OK;
// Start with a raw copy.
memcpy(&bpResDest, &bpResSrc, sizeof(BP_ERROR_RESOLUTION_INFO));
// The fields in the destination is the result of the AND of bpInfoSrc.dwFields
// and dwFields.
bpResDest.dwFields = dwFields & bpResSrc.dwFields;
// Fill in the bp location information if the BPERESI_BPRESLOCATION flag
// is set in BPERESI_FIELDS.
if (IsFlagSet(bpResDest.dwFields, BPERESI_BPRESLOCATION))
{
// Switch on the BP_TYPE.
switch (bpResSrc.bpResLocation.bpType)
{
case BPT_CODE:
{
// AddRef the IDebugCodeContext2 of the BP_RESOLUTION_CODE structure.
bpResDest.bpResLocation.bpResLocation.bpresCode.pCodeContext->AddRef();
break;
}
case BPT_DATA:
{
// Copy the bstrDataExpr, bstrFunc, and bstrImage of the
// BP_RESOLUTION_DATA structure.
bpResDest.bpResLocation.bpResLocation.bpresData.bstrDataExpr =
SysAllocString(bpResSrc.bpResLocation.bpResLocation.bpresData.bstrDataExpr);
bpResDest.bpResLocation.bpResLocation.bpresData.bstrFunc =
SysAllocString(bpResSrc.bpResLocation.bpResLocation.bpresData.bstrFunc);
bpResSrc.bpResLocation.bpResLocation.bpresData.bstrImage =
SysAllocString(bpResSrc.bpResLocation.bpResLocation.bpresData.bstrImage);
break;
}
default:
{
assert(FALSE);
// Clear the BPERESI_BPRESLOCATION flag of the BPERESI_FIELDS
// in the destination BP_ERROR_RESOLUTION_INFO.
ClearFlag(bpResDest.dwFields, BPERESI_BPRESLOCATION);
break;
}
}
}
// AddRef the IDebugProgram2 if the BPRESI_PROGRAM flag is set in the BPRESI_FIELDS.
if (IsFlagSet(bpResDest.dwFields, BPERESI_PROGRAM))
{
bpResDest.pProgram->AddRef();
}
// AddRef the IDebuThread2 if the BPRESI_THREAD flag is set in the BPRESI_FIELDS.
if (IsFlagSet(bpResDest.dwFields, BPERESI_THREAD))
{
bpResDest.pThread->AddRef();
}
// Check if the BPERESI_MESSAGE flag is set in the BPRESI_FIELDS.
if (IsFlagSet(bpResDest.dwFields, BPERESI_MESSAGE))
{
// Copy the source bstrMessage into the destination bstrMessage.
bpResDest.bstrMessage = SysAllocString(bpResSrc.bstrMessage);
// Clear the destination flag if there is no message.
if (!bpResDest.bstrMessage)
{
ClearFlag(bpResDest.dwFields, BPERESI_MESSAGE);
}
}
return hr;
}