Sdílet prostřednictvím


Ukázková implementace vyhodnocení výrazu

Důležité

V sadě Visual Studio 2015 je tento způsob implementace vyhodnocovačů výrazů zastaralý. Informace o implementaci vyhodnocovačů výrazů CLR najdete v tématu vyhodnocovače výrazů CLR a ukázka vyhodnocovače spravovaných výrazů.

Pro výraz okna kukátka Visual Studio volá ParseText k vytvoření IDebugExpression2 objektu. IDebugExpressionContext2::ParseText vytvoří instanci vyhodnocovače výrazu (EE) a volání Parse získat IDebugParsedExpression objektu.

Provede IDebugExpressionEvaluator::Parse následující úlohy:

  1. [Pouze C++] Parsuje výraz tak, aby vyhledá chyby.

  2. Vytvoří instanci třídy (volané CParsedExpression v tomto příkladu), která spouští IDebugParsedExpression rozhraní a ukládá ve třídě výraz, který se má analyzovat.

  3. IDebugParsedExpression Vrátí rozhraní z objektuCParsedExpression.

Poznámka:

V příkladech, které následují a v ukázce MyCEE, vyhodnocení výrazu neodděluje analýzu od vyhodnocení.

Spravovaný kód

Následující kód ukazuje implementaci spravovaného IDebugExpressionEvaluator::Parse kódu. Tato verze metody vymění parsování na EvaluateSync jako kód pro parsování se také vyhodnotí současně (viz Vyhodnocení výrazu 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;
        }
    }
}

Nespravovaný kód

Následující kód je implementace IDebugExpressionEvaluator::Parse v nespravovaném kódu. Tato metoda volá pomocnou funkci , Parseparsovat výraz a kontrolovat chyby, ale tato metoda ignoruje výslednou hodnotu. Formální vyhodnocení je odloženo na EvaluateSync , kde se výraz parsuje při vyhodnocování (viz Vyhodnocení výrazu 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;
}

Viz také