IDebugComPlusSymbolProvider::GetAddressesInModuleFromPosition
문서 위치를에 있는 지정 된 모듈의 디버그 주소 배열에 매핑합니다.
[C++]
HRESULT GetAddressesInModuleFromPosition(
ULONG32 ulAppDomainID,
GUID guidModule,
IDebugDocumentPosition2* pDocPos,
BOOL fStatmentOnly,
IEnumDebugAddresses** ppEnumBegAddresses,
IEnumDebugAddresses** ppEnumEndAddresses
);
[C#]
int GetAddressesInModuleFromPosition(
uint ulAppDomainID,
Guid guidModule,
IDebugDocumentPosition2 pDocPos,
bool fStatmentOnly,
out IEnumDebugAddresses ppEnumBegAddresses,
out IEnumDebugAddresses ppEnumEndAddresses
);
매개 변수
ulAppDomainID
[in] 응용 프로그램 도메인 식별자입니다.guidModule
[in] 모듈의 고유 식별자입니다.pDocPos
[in] 문서 위치입니다.fStatmentOnly
[in] 경우 TRUE, 디버그 주소 단일 문으로 제한 됩니다.ppEnumBegAddresses
[out] 이 문 또는 선으로 연결 된 디버그 시작 주소에 대 한 열거자를 반환 합니다.ppEnumEndAddresses
[out] 이 문 또는 선으로 연결 된 디버그 끝 주소에 대 한 열거자를 반환 합니다.
반환 값
성공 하면 반환 S_OK. 그렇지 않으면 오류 코드를 반환 합니다.
예제
다음 예제에서는이 메서드를 구현 하는 방법을 보여 줍니다 있는 CDebugSymbolProvider 를 노출 하는 개체는 IDebugComPlusSymbolProvider 인터페이스.
HRESULT CDebugSymbolProvider::GetAddressesInModuleFromPosition(
ULONG32 ulAppDomainID,
GUID guidModule,
IDebugDocumentPosition2* pDocPos,
BOOL fStatementOnly,
IEnumDebugAddresses** ppEnumBegAddresses,
IEnumDebugAddresses** ppEnumEndAddresses
)
{
GUID guidNULL = {0};
if (guidNULL == guidModule)
{
return GetAddressesInAppDomainFromPosition( ulAppDomainID,
pDocPos,
fStatementOnly,
ppEnumBegAddresses,
ppEnumEndAddresses );
}
else
{
return GetAddressesInModuleFromPositionHelper( ulAppDomainID,
guidModule,
pDocPos,
fStatementOnly,
ppEnumBegAddresses,
ppEnumEndAddresses );
}
}
HRESULT CDebugSymbolProvider::GetAddressesInModuleFromPositionHelper(
ULONG32 ulAppDomainID,
GUID guidModule,
IDebugDocumentPosition2* pDocPos,
BOOL fStatementOnly,
IEnumDebugAddresses** ppEnumBegAddresses,
IEnumDebugAddresses** ppEnumEndAddresses
)
{
HRESULT hr = S_OK;
CComBSTR bstrFileName;
TEXT_POSITION posBeg;
TEXT_POSITION posEnd;
DWORD dwLine;
USHORT segRet = 0;
ULONG offRet = 0;
CAddrList listAddr;
CAddrList listAddrEnd;
CAddrList* plistAddrEnd = NULL;
bool fFileFound = false;
Module_ID idModule(ulAppDomainID, guidModule);
DWORD dwListCount;
bool fFoundAddresses = false;
CComPtr<CModule> pmodule;
DWORD dwBegCol = 0;
DWORD dwEndCol = 0;
ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
ASSERT(IsValidInterfacePtr(pDocPos, IDebugDocumentPosition2));
ASSERT(IsValidWritePtr(ppEnumBegAddresses, IEnumDebugAddresses*));
METHOD_ENTRY(CDebugSymbolProvider::GetAddressesInModuleFromPositionHelper);
// Bail on Invalid Args
IfFalseGo( pDocPos && ppEnumBegAddresses, E_INVALIDARG );
*ppEnumBegAddresses = NULL;
if (ppEnumEndAddresses)
{
*ppEnumEndAddresses = NULL;
plistAddrEnd = &listAddrEnd;
}
// Get the Position
IfFailGo( pDocPos->GetFileName(&bstrFileName) );
IfFailGo( pDocPos->GetRange(&posBeg, &posEnd) );
// Iterate over the module list accumulating addresses
// that match the position
dwLine = posBeg.dwLine;
IfFailGo( GetModule( idModule, &pmodule ) );
dwListCount = listAddr.GetCount();
if ( fStatementOnly )
{
dwBegCol = posBeg.dwColumn;
dwEndCol = posBeg.dwLine == posEnd.dwLine ? posEnd.dwColumn : DWORD( -1);
}
else
{
dwBegCol = 0;
dwEndCol = DWORD( -1);
}
while (!fFoundAddresses && dwLine <= posEnd.dwLine )
{
hr = pmodule->GetAddressesFromLine( bstrFileName,
dwLine,
posEnd.dwLine,
dwBegCol,
dwEndCol,
&listAddr,
plistAddrEnd );
dwLine++;
dwBegCol = 0;
dwEndCol = dwLine == posEnd.dwLine ? posEnd.dwColumn : DWORD( -1);
if (hr == E_SH_INVALID_POSITION)
{
fFileFound = true;
break;
}
if (FAILED(hr))
{
// Move on to the next module
break;
}
fFileFound = true;
fFoundAddresses = listAddr.GetCount() != dwListCount;
}
// Distinguish no file from bad position in the file
IfFalseGo( fFileFound, E_SH_FILE_NOT_FOUND);
// If the list is empty the position is bad
IfFalseGo( listAddr.GetCount(), E_SH_INVALID_POSITION );
// Create enumerators
IfFailGo( CreateEnumerator( ppEnumBegAddresses, &listAddr ) );
if (ppEnumEndAddresses)
{
IfFailGo( CreateEnumerator( ppEnumEndAddresses, &listAddrEnd ) );
}
Error:
METHOD_EXIT(CDebugSymbolProvider::GetAddressesInModuleFromPositionHelper, hr);
return hr;
}