式の評価の実装のサンプル
重要
Visual Studio 2015 では、この方法での式エバリュエーターの実装は非推奨です。 CLR 式エバリュエーターの実装については、CLR 式エバリュエーターに関する記事とマネージド式エバリュエーターのサンプルに関する記事をご覧ください。
ウォッチ ウィンドウ式の場合、Visual Studio はparsetextを呼び出して、IDebugExpression2 オブジェクトを作成します。 IDebugExpressionContext2::ParseText
により式エバリュエーター (EE) がインスタンス化され、 Parse が呼び出されて IDebugParsedExpression オブジェクトが取得されます。
IDebugExpressionEvaluator::Parse
により、次のタスクが実行されます。
[C++ のみ] 式を解析してエラーを探します。
IDebugParsedExpression
インターフェイスを実行し、解析する式をクラスに格納するクラス (この例ではCParsedExpression
と呼ばれる) をインスタンス化します。CParsedExpression
オブジェクトからIDebugParsedExpression
インターフェイスを返します。
Note
次に示す例と、MyCEE サンプルの例では、式エバリュエーターが評価から解析を分離していません。
マネージド コード
次のコードは、マネージド コードでの IDebugExpressionEvaluator::Parse
の実装を示します。 このバージョンのメソッドは、解析用のコードも同時に評価されるため、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
を呼び出して式を解析し、エラーをチェックしますが、結果の値は無視されます。 正式な評価は、評価時に式が解析される 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;
}