運算式評估的實作範例
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
重要
在 Visual Studio 2015,這種實作運算式評估工具已被取代。 如需實作 CLR 運算式評估工具的資訊,請參閱CLR 運算式評估工具和Managed 運算式評估工具範例。
如監看式視窗運算式,Visual Studio 會呼叫ParseText產生IDebugExpression2物件。 IDebugExpressionContext2::ParseText
具現化的運算式評估工具 (EE) 並呼叫剖析取得IDebugParsedExpression物件。
這項實作的IDebugExpressionEvaluator::Parse
會執行下列工作︰
[只有 c + +]剖析運算式,尋找錯誤。
具現化類別 (稱為
CParsedExpression
在此範例中) 來實作IDebugParsedExpression
介面,並儲存在類別中,運算式才能進行剖析。傳回
IDebugParsedExpression
介面從CParsedExpression
物件。
注意
在接下來的範例和 MyCEE 範例中,運算式評估工具不會分開計算所得的剖析。
Managed 程式碼
這是實作IDebugExpressionEvaluator::Parse
managed 程式碼中。 請注意,這個版本的方法會延遲到剖析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
,若要剖析的運算式和檢查是否發生錯誤,但這個方法會忽略所產生的值。 正式的評估會延後至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;
}