Freigeben über


Beispielimplementierung der Ausdrucksauswertung

Wichtig

Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.

Für einen Watch-Fensterausdruck ruft Visual Studio ParseText auf, um ein IDebugExpression2-Objekt zu erzeugen. IDebugExpressionContext2::ParseText instanziiert eine Ausdrucksauswertung (EE) und ruft Parse auf, um ein IDebugParsedExpression-Objekt zu erhalten.

IDebugExpressionEvaluator::Parse führt die folgenden Aufgaben aus:

  1. [Nur C++ ] Analysiert den Ausdruck, um nach Fehlern zu suchen.

  2. Instanziiert eine Klasse (CParsedExpression in diesem Beispiel), die die IDebugParsedExpression-Schnittstelle ausführt und in der Klasse den zu analysierenden Ausdruck speichert.

  3. Gibt die IDebugParsedExpression Schnittstelle aus dem CParsedExpression-Objekt zurück.

Hinweis

In den folgenden Beispielen und im MyCEE-Beispiel trennt die Ausdrucksauswertung die Analyse nicht von der Auswertung.

Verwalteter Code

Der folgende Code zeigt eine Implementierung von IDebugExpressionEvaluator::Parse in verwaltetem Code. Diese Version der Methode überträgt die Analyse auf EvaluateSync, da der Code für die Analyse ebenfalls gleichzeitig ausgewertet wird (siehe Auswertung eines Watch-Ausdrucks).

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

Nicht verwalteter Code

Der folgende Code zeigt eine Implementierung von IDebugExpressionEvaluator::Parse in nicht verwaltetem Code. Diese Methode ruft die Hilfsfunktion Parse auf, um den Ausdruck zu analysieren und auf Fehler zu überprüfen, aber diese Methode ignoriert den resultierenden Wert. Die formale Auswertung wird auf EvaluateSync übertragen, wo der Ausdruck analysiert wird, während er ausgewertet wird (siehe Auswertung eines Watch-Ausdrucks).

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

Siehe auch