Condividi tramite


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:

  1. Chiamate IDebugSymbolProvider:: GetContainerField, passando IDebugAddress l'oggetto. Il provider del (SP) simbolo restituisce IDebugContainerField un oggetto che rappresenta il metodo contenente l'indirizzo specificato.

  2. ottiene IDebugMethodField da IDebugContainerField.

  3. 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.

  4. 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;
}

Vedere anche

Concetti

Implementazione di esempio variabili locali