IDebugComPlusSymbolProvider::GetAddressesInModuleFromPosition
Mappe una posizione del documento nel modulo specificato in una matrice di indirizzi di debug.
Sintassi
int GetAddressesInModuleFromPosition(
uint ulAppDomainID,
Guid guidModule,
IDebugDocumentPosition2 pDocPos,
bool fStatmentOnly,
out IEnumDebugAddresses ppEnumBegAddresses,
out IEnumDebugAddresses ppEnumEndAddresses
);
Parametri
ulAppDomainID
[in] Identificatore di dominio applicazione.
guidModule
[in] Identificatore univoco del modulo.
pDocPos
[in] Posizione del documento.
fStatmentOnly
[in] Se TRUE
, limita gli indirizzi di debug a una singola istruzione.
ppEnumBegAddresses
[out] Restituisce un enumeratore per gli indirizzi di debug iniziale associati a questa istruzione o riga.
ppEnumEndAddresses
[out] Restituisce un enumeratore per gli indirizzi di debug finali associati a questa istruzione o riga.
Valore restituito
Se ha esito positivo, restituisce S_OK
; in caso contrario, restituisce un codice di errore.
Esempio
Nell'esempio seguente viene illustrato come implementare questo metodo per un oggetto CDebugSymbolProvider che espone l'interfaccia 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;
}