Partager via


implémenter GetMethodProperty

Visual Studio appelle IDebugStackFrame2 : : GetDebugProperty(DE) du moteur de débogage, qui appelle ensuite IDebugExpressionEvaluator : : GetMethodProperty pour obtenir des informations sur la méthode actuelle sur le frame de pile.

cette implémentation d' IDebugExpressionEvaluator::GetMethodProperty effectue les tâches suivantes :

  1. Appels IDebugSymbolProvider : : GetContainerField, en passant l'objet d' IDebugAddress . Le fournisseur de symbole (SP) retourne IDebugContainerField représentant la méthode qui contient l'adresse spécifiée.

  2. obtient IDebugMethodField d' IDebugContainerField.

  3. Instancie une classe ( CFieldProperty appelé par exemple) qui implémente l'interface d' IDebugProperty2 et contient l'objet d' IDebugMethodField retourné de SP.

  4. Retourne l'interface d' IDebugProperty2 de l'objet d' CFieldProperty .

Code managé

cet exemple montre une implémentation d' IDebugExpressionEvaluator::GetMethodProperty en code managé.

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

Le code non managé

Cet exemple montre une implémentation d' IDebugExpressionEvaluator::GetMethodProperty dans du code non managé.

[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;
}

Voir aussi

Concepts

Implémentation de l'exemple les variables locales