共用方式為


運算式評估的實作範例

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

重要

在 Visual Studio 2015,這種實作運算式評估工具已被取代。 如需實作 CLR 運算式評估工具的資訊,請參閱CLR 運算式評估工具Managed 運算式評估工具範例

監看式視窗運算式,Visual Studio 會呼叫ParseText產生IDebugExpression2物件。 IDebugExpressionContext2::ParseText具現化的運算式評估工具 (EE) 並呼叫剖析取得IDebugParsedExpression物件。

這項實作的IDebugExpressionEvaluator::Parse會執行下列工作︰

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

  2. 具現化類別 (稱為CParsedExpression在此範例中) 來實作IDebugParsedExpression介面,並儲存在類別中,運算式才能進行剖析。

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

注意

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

Managed 程式碼

這是實作IDebugExpressionEvaluator::Parsemanaged 程式碼中。 請注意,這個版本的方法會延遲到剖析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::Parseunmanaged 程式碼中。 這個方法會呼叫 helper 函式, 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;  
}  

另請參閱

監看式 視窗中的運算式評估
監看式運算式評估