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


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

Важно!

В Visual Studio 2015 такая реализация вычислителя выражений была сделана нерекомендуемой. Сведения о реализации вычислителей выражений в среде CLR см. на страницах CLR expression evaluators (Вычислители выражений CLR) и Managed expression evaluator sample (Пример управляемого вычислителя выражений).

Для выражения окна Контрольных значений Visual Studio вызывает ParseText, чтобы создать объект IDebugExpression2. IDebugExpressionContext2::ParseText создает экземпляр вычислителя выражений и вызывает метод Parse, чтобы получить объект IDebugParsedExpression.

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

  1. [только C++] анализирует выражение на наличие ошибок;

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

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

Примечание.

В следующих примерах и в примере MyCEE вычислитель выражений не разделяет вычисление и анализ.

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

Ниже показана реализация IDebugExpressionEvaluator::Parse в управляемом коде. Эта версия метода передает задачу анализа методу 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 для анализа выражения и проверки наличия ошибок, однако он игнорирует результирующее значение. Формальное вычисление передается методу 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;
}

См. также