implementare GetMethodProperty
Visual Studio chiama il motore (DE) IDebugStackFrame2:: GetDebugPropertydi debug, che a sua volta chiama IDebugExpressionEvaluator:: GetMethodProperty per ottenere informazioni sul metodo corrente nello stack frame.
Questa implementazione di IDebugExpressionEvaluator::GetMethodProperty esegue le attività seguenti:
Chiamate IDebugSymbolProvider:: GetContainerField, passando IDebugAddress l'oggetto. Il provider del (SP) simbolo restituisce IDebugContainerField un oggetto che rappresenta il metodo contenente l'indirizzo specificato.
ottiene IDebugMethodField da IDebugContainerField.
Creare un'istanza di una classe (chiamata CFieldProperty in questo esempio) che implementa IDebugProperty2 l'interfaccia e contiene l'oggetto di IDebugMethodField restituito da SP.
Restituisce l'interfaccia di IDebugProperty2 dall'oggetto di CFieldProperty .
Codice gestito
In questo esempio viene illustrata l'implementazione di IDebugExpressionEvaluator::GetMethodProperty nel codice gestito.
namespace EEMC
{
[GuidAttribute("462D4A3D-B257-4AEE-97CD-5918C7531757")]
public class EEMCClass : IDebugExpressionEvaluator
{
public HRESULT GetMethodProperty(
IDebugSymbolProvider symbolProvider,
IDebugAddress address,
IDebugBinder binder,
int includeHiddenLocals,
out IDebugProperty2 property)
{
IDebugContainerField containerField = null;
IDebugMethodField methodField = null;
property = null;
// Get the containing method field.
symbolProvider.GetContainerField(address, out containerField);
methodField = (IDebugMethodField) containerField;
// Return the property of method field.
property = new CFieldProperty(symbolProvider, address, binder, methodField);
return COM.S_OK;
}
}
}
codice non gestito
In questo esempio viene illustrata l'implementazione di IDebugExpressionEvaluator::GetMethodProperty nel codice non gestito.
[CPP]
STDMETHODIMP CExpressionEvaluator::GetMethodProperty(
in IDebugSymbolProvider *pprovider,
in IDebugAddress *paddress,
in IDebugBinder *pbinder,
in BOOL includeHiddenLocals,
out IDebugProperty2 **ppproperty
)
{
if (pprovider == NULL)
return E_INVALIDARG;
if (ppproperty == NULL)
return E_INVALIDARG;
else
*ppproperty = 0;
HRESULT hr;
IDebugContainerField* pcontainer = NULL;
hr = pprovider->GetContainerField(paddress, &pcontainer);
if (FAILED(hr))
return hr;
IDebugMethodField* pmethod = NULL;
hr = pcontainer->QueryInterface( IID_IDebugMethodField,
reinterpret_cast<void**>(&pmethod));
pcontainer->Release();
if (FAILED(hr))
return hr;
CFieldProperty* pfieldProperty = new CFieldProperty( pprovider,
paddress,
pbinder,
pmethod );
pmethod->Release();
if (!pfieldProperty)
return E_OUTOFMEMORY;
hr = pfieldProperty->Init();
if (FAILED(hr))
{
pfieldProperty->Release();
return hr;
}
hr = pfieldProperty->QueryInterface( IID_IDebugProperty2,
reinterpret_cast<void**>(ppproperty));
pfieldProperty->Release();
return hr;
}