共用方式為


運算式評估的實作範例

對於監看式視窗運算式、 Visual Studio 的呼叫IDebugExpressionContext2::ParseText來產生IDebugExpression2物件。 IDebugExpressionContext2::ParseText具現化的運算式評估工具 (EE) 和呼叫IDebugExpressionEvaluator::Parse以取得IDebugParsedExpression物件。

這項實作的IDebugExpressionEvaluator::Parse可以執行下列工作:

  1. [只有 c + +]剖析的運算式,以找出錯誤。

  2. 具現化類別 (稱為CParsedExpression在本例中) 實作IDebugParsedExpression介面,並且在類別中,將儲存要剖析的運算式。

  3. 傳回IDebugParsedExpression介面從CParsedExpression物件。

注意事項注意事項

在接下來的範例和 MyCEE 範例中,運算式評估工具並不會分開計算所得的剖析。

Managed 程式碼

這是實作的IDebugExpressionEvaluator::Parse在 managed 程式碼。 請注意會延後此版本的方法來剖析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;
        }
    }
}

Unmanaged 程式碼

這是實作的IDebugExpressionEvaluator::Parse unmanaged 程式碼中。 這個方法會呼叫 helper 函式, 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;
}

請參閱

概念

監看式視窗運算式評估

評估 [監看運算式