次の方法で共有


式の評価の実装のサンプル

重要

Visual Studio 2015 では、この方法での式エバリュエーターの実装は非推奨です。 CLR 式エバリュエーターの実装については、CLR 式エバリュエーターに関する記事とマネージド式エバリュエーターのサンプルに関する記事をご覧ください。

ウォッチ ウィンドウ式の場合、Visual Studio はparsetextを呼び出して、IDebugExpression2 オブジェクトを作成します。 IDebugExpressionContext2::ParseText により式エバリュエーター (EE) がインスタンス化され、 Parse が呼び出されて IDebugParsedExpression オブジェクトが取得されます。

IDebugExpressionEvaluator::Parse により、次のタスクが実行されます。

  1. [C++ のみ] 式を解析してエラーを探します。

  2. IDebugParsedExpression インターフェイスを実行し、解析する式をクラスに格納するクラス (この例では CParsedExpression と呼ばれる) をインスタンス化します。

  3. 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;
}

関連項目