IDebugErrorBreakpointResolution2::GetResolutionInfo
获取断点错误解析信息。
语法
int GetResolutionInfo(
enum_BPERESI_FIELDS dwFields,
BP_ERROR_RESOLUTION_INFO[] pErrorResolutionInfo
);
参数
dwFields
[in]BPERESI_FIELDS枚举中的标志的组合,用于确定要填写哪些pErrorResolutionInfo
字段。
pErrorResolutionInfo
[in, out]用 断点解析的说明填充的BP_ERROR_RESOLUTION_INFO 结构。
返回值
如果成功,则返回 S_OK
;否则,返回错误代码。
示例
以下示例为公开 IDebugErrorBreakpointResolution2 接口的简单CDebugErrorBreakpointResolution
对象实现此方法。
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;
}