Exemple d’implémentation de l’évaluation des expressions

Important

Dans Visual Studio 2015, cette façon d’implémenter des évaluateurs d’expression est déconseillée. Pour plus d’informations sur l’implémentation d’évaluateurs d’expression CLR, consultez l’exemple d’évaluateur d’expression CLR et d’évaluateur d’expression managée.

Pour une expression de fenêtre Watch , Visual Studio appelle ParseText pour produire un objet IDebugExpression2 . IDebugExpressionContext2::ParseText instancie un évaluateur d’expression (EE) et appelle Parse pour obtenir un objet IDebugParsedExpression .

Les IDebugExpressionEvaluator::Parse tâches suivantes sont effectuées :

  1. [C++ uniquement] Analyse l’expression pour rechercher des erreurs.

  2. Instancie une classe (appelée CParsedExpression dans cet exemple) qui exécute l’interface IDebugParsedExpression et stocke dans la classe l’expression à analyser.

  3. Retourne l’interface IDebugParsedExpression de l’objet CParsedExpression .

Remarque

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

Code managé

Le code suivant montre une implémentation dans IDebugExpressionEvaluator::Parse le code managé. Cette version de la méthode reporte l’analyse à EvaluateSync en tant que code pour l’analyse évalue également en même temps (voir Évaluer une expression Watch).

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

Code non managé

Le code suivant est une implémentation du IDebugExpressionEvaluator::Parse code non managé. Cette méthode appelle une fonction d’assistance, Parsepour analyser l’expression et case activée pour les erreurs, mais cette méthode ignore la valeur résultante. L’évaluation formelle est différée à EvaluateSync où l’expression est analysée pendant qu’elle est évaluée (voir Évaluer une expression Watch).

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