表达式计算的实现示例

重要

在 Visual Studio 2015 中,这种实现表达式计算器的方法已弃用。 有关实现 CLR 表达式计算器的信息,请参阅 CLR 表达式计算器托管表达式计算器示例

对于监视窗口表达式,Visual Studio 调用 ParseText 来生成 IDebugExpression2 对象。 IDebugExpressionContext2::ParseText 实例化表达式计算器 (EE) 并调用分析 以获取 IDebugParsedExpression 对象。

IDebugExpressionEvaluator::Parse 执行以下任务:

  1. [仅限 C++] 分析表达式以查找错误。

  2. 实例化运行 IDebugParsedExpression 接口的类(此例中称为 CParsedExpression),并在类中存储要分析的表达式。

  3. IDebugParsedExpression 对象返回 CParsedExpression 接口。

注意

在后面的示例以及 MyCEE 示例中,表达式计算器不会将分析与计算分开。

托管代码

下面的代码显示托管代码中 IDebugExpressionEvaluator::Parse 的实现。 此方法版本将分析延迟到 EvaluateSync,因为用于分析的代码也在同时进行计算(请参阅计算 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;
        }
    }
}

非托管代码

以下代码是非托管代码中的 IDebugExpressionEvaluator::Parse 实现。 此方法调用帮助程序函数 Parse 来分析表达式并检查错误,但此方法会忽略生成的值。 正式的计算会延迟到 EvaluateSync,其中表达式会在计算时进行分析(请参阅计算 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;
}

另请参阅