采样表达式计算的实现

监视 窗口表达式, Visual Studio 会调用 IDebugExpressionContext2:: ParseText 导致 IDebugExpression2 对象。 IDebugExpressionContext2::ParseText 实例化表达式计算器 (EE)并调用 IDebugExpressionEvaluator:: 分析 获取 IDebugParsedExpression 对象。

IDebugExpressionEvaluator::Parse 的此实现执行以下任务:

  1. 只有 C++ [] 分析表达式查找错误。

  2. 实例化类 (称为在此示例中的 CParsedExpression ) 实现 IDebugParsedExpression 接口和存储类的要分析的表达式。

  3. 返回从 CParsedExpression 对象的 IDebugParsedExpression 接口。

备注

在 MyCEE 示例遵循和示例中,表达式计算器从计算不分隔分析。

托管代码

这是 IDebugExpressionEvaluator::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;
}

请参见

概念

计算 " 监视 " 窗口表达式

计算监视表达式