Partager via


Exemple d'implémentation d'évaluation de l'expression

Pour une expression de la fenêtre d' Espion , Visual Studio appelle IDebugExpressionContext2 : : ParseText pour produire un objet d' IDebugExpression2 . IDebugExpressionContext2::ParseText instancie un évaluateur d'expression (EE) et appelle IDebugExpressionEvaluator : : analysez pour obtenir un objet d' IDebugParsedExpression .

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

  1. [C++] analyse uniquement l'expression à rechercher des erreurs.

  2. Instancie une classe ( CParsedExpression appelé par exemple) qui implémente l'interface d' IDebugParsedExpression et stocker dans la classe l'expression à analyser.

  3. Retourne l'interface d' IDebugParsedExpression de l'objet d' CParsedExpression .

Notes

Dans les exemples qui suivent et dans l'exemple de MyCEE, l'évaluateur d'expression ne sépare pas de l'évaluation.

Code managé

Il s'agit d'une implémentation d' IDebugExpressionEvaluator::Parse en code managé. Notez que cette version de la méthode diffère l'analyse à IDebugParsedExpression : : EvaluateSync à mesure que le code pour analyser également a en même temps (voir l' Évaluer une expression espionne).

namespace EEMC
{
    public class CParsedExpression : IDebugParsedExpression
    {
        public HRESULT Parse(
                string                 expression, 
                uint                   parseFlags,
                uint                   radix,
            out string                 errorMessage, 
            out uint                   errorPosition, 
            out IDebugParsedExpression parsedExpression)
        { 
            errorMessage = "";
            errorPosition = 0;

            parsedExpression =
                new CParsedExpression(parseFlags, radix, expression);
            return COM.S_OK;
        }
    }
}

Le code non managé

Il s'agit d'une implémentation d' IDebugExpressionEvaluator::Parse dans du code non managé. Cette méthode appelle une fonction d'assistance, Parse, analyser l'expression et vérifier les erreurs mais cette méthode rejette la valeur résultante. L'évaluation formelle est différée jusqu'à IDebugParsedExpression : : EvaluateSync où l'expression est analysée pendant qu'elle est évaluée (voir l' Évaluer une expression espionne).

STDMETHODIMP CExpressionEvaluator::Parse(
        in    LPCOLESTR                 pszExpression,
        in    PARSEFLAGS                flags,
        in    UINT                      radix,
        out   BSTR                     *pbstrErrorMessages,
        inout UINT                     *perrorCount,
        out   IDebugParsedExpression  **ppparsedExpression
    )
{
    if (pbstrErrorMessages == NULL)
        return E_INVALIDARG;
    else
        *pbstrErrormessages = 0;

    if (pparsedExpression == NULL)
        return E_INVALIDARG;
    else
        *pparsedExpression = 0;

    if (perrorCount == NULL)
        return E_INVALIDARG;

    HRESULT hr;
    // Look for errors in the expression but ignore results
    hr = ::Parse( pszExpression, pbstrErrorMessages );
    if (hr != S_OK)
        return hr;

    CParsedExpression* pparsedExpr = new CParsedExpression( radix, flags, pszExpression );
    if (!pparsedExpr)
        return E_OUTOFMEMORY;

    hr = pparsedExpr->QueryInterface( IID_IDebugParsedExpression,
                                      reinterpret_cast<void**>(ppparsedExpression) );
    pparsedExpr->Release();

    return hr;
}

Voir aussi

Concepts

Évaluer une expression de la fenêtre Espion

Évaluer une expression espionne