Поделиться через


Пример реализации вычисления выражений

Для a Контрольное значение выражение окна, вызовы Visual Studio IDebugExpressionContext2::ParseText создать IDebugExpression2 объект. IDebugExpressionContext2::ParseText создает средство оценки выражений (EE) и вызовы IDebugExpressionEvaluator::Parse доступ IDebugParsedExpression объект.

Эта реализация IDebugExpressionEvaluator::Parse выполняет следующие задачи:

  1. [C++] только анализирует выражение для поиска ошибки.

  2. Создает класс с именем " ( CParsedExpression в этом примере) этом реализует IDebugParsedExpression интерфейс и сохраняет в классе выражение, которое необходимо проанализировать.

  3. Возвращает IDebugParsedExpression интерфейс из CParsedExpression объект.

Примечание

В примерах, приведенных ниже, и в образце MyCEE, средство оценки выражений не разделяет анализ из вычислений.

Управляемый код

Эта реализация IDebugExpressionEvaluator::Parse в управляемом коде. Обратите внимание, что данная версия метода parse к откладывает IDebugParsedExpression::EvaluateSync по мере того, как код для анализа также является одновременно (см. Вычисление выражения контрольное значение).

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

Неуправляемый код

Эта реализация IDebugExpressionEvaluator::Parse в неуправляемом коде. Этот метод вызывает вспомогательную функцию, Parse, выполнить синтаксический анализ выражения и проверка ошибок, но этого метода не учитывает результирующее значение. Оценка отложена к формальным IDebugParsedExpression::EvaluateSync где синтаксическом анализе выражения, пока его вычисления (см. Вычисление выражения контрольное значение).

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

См. также

Основные понятия

Вычисление выражения в окне контрольных значений

Вычисление выражения контрольное значение