IDebugComPlusSymbolProvider::GetTypeFromAddress
Recupera a um tipo de símbolo, dado seu endereço de depuração.
HRESULT GetTypeFromAddress(
IDebugAddress* pAddress,
IDebugField** ppField
);
int GetTypeFromAddress(
IDebugAddress pAddress,
out IDebugField ppField
);
Parâmetros
pAddress
[in] O depurador de endereço é representado por um IDebugAddress interface.ppField
[out] Retorna o tipo de matriz, conforme ele é representado por um IDebugClassField interface.
Valor de retorno
Se bem-sucedida, retorna S_OK; Caso contrário, retorna um código de erro.
Exemplo
O exemplo a seguir mostra como implementar este método para um CDebugSymbolProvider objeto que expõe a IDebugComPlusSymbolProvider interface.
HRESULT CDebugSymbolProvider::GetTypeFromAddress(
IDebugAddress *pAddress,
IDebugField **ppField)
{
HRESULT hr = E_FAIL;
CDEBUG_ADDRESS da;
CDebugGenericParamScope* pGenScope = NULL;
METHOD_ENTRY( CDebugDynamicFieldSymbol::GetTypeFromPrimitive );
ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
ASSERT(IsValidWritePtr(ppField, IDebugField*));
IfFailGo( pAddress->GetAddress(&da) );
switch ( da.addr.dwKind )
{
case ADDRESS_KIND_METADATA_LOCAL:
case ADDRESS_KIND_METADATA_PARAM:
case ADDRESS_KIND_METADATA_FIELD:
case ADDRESS_KIND_METADATA_ARRAYELEM:
case ADDRESS_KIND_METADATA_METHOD:
{
IfFailGo( this->CreateClassType(da.GetModule(), da.tokClass, ppField) );
break;
}
case ADDRESS_KIND_METADATA_RETVAL:
{
if ( da.addr.addr.addrRetVal.dwCorType )
{
IfNullGo( pGenScope = new CDebugGenericParamScope(da.GetModule(), da.tokClass, da.GetMethod()), E_OUTOFMEMORY );
IfFailGo( this->CreateType((const COR_SIGNATURE*)(&da.addr.addr.addrRetVal.rgSig),
da.addr.addr.addrRetVal.dwSigSize,
da.GetModule(),
mdMethodDefNil,
pGenScope,
ppField) );
}
else
{
IfFailGo( this->CreateClassType(da.GetModule(), da.tokClass, ppField) );
}
break;
}
default:
{
ASSERT(!"Address type not supported.");
}
}
Error:
METHOD_EXIT( CDebugDynamicFieldSymbol::GetTypeFromPrimitive, hr );
RELEASE( pGenScope );
return hr;
}