次の方法で共有


IDebugExpressionContext2::ParseText

後で評価するために、テキスト形式の式を解析します。

構文

int ParseText(
    string                pszCode,
    enum_PARSEFLAGS       dwFlags,
    uint                  nRadix,
    out IDebugExpression2 ppExpr,
    out string            pbstrError,
    out uint              pichError
);

パラメーター

pszCode
[入力] 解析する式。

dwFlags
[入力] 解析を制御する PARSEFLAGS 列挙型のフラグの組み合わせ。

nRadix
[入力] pszCode の数値情報の解析に使用される基数。

ppExpr
[出力] バインドと評価の準備ができている、解析された式を表す IDebugExpression2 オブジェクトを返します。

pbstrError
[出力] 式にエラーが含まれている場合は、エラー メッセージを返します。

pichError
[出力] 式にエラーが含まれている場合は、pszCode のエラーの文字インデックスを返します。

戻り値

成功した場合は、S_OK を返します。それ以外の場合は、エラー コードを返します。

解説

このメソッドが呼び出されると、デバッグ エンジン (DE) は、式を解析して、正しいかどうかを検証する必要があります。 式が無効な場合は、pbstrError および pichError パラメーターを設定できます。

式は評価されず、解析のみが行われることに注意してください。 後で EvaluateSync または EvaluateAsync メソッドを呼び出すと、解析された式が評価されます。

次の例は、IDebugExpressionContext2 インターフェイスを公開する単純な CEnvBlock オブジェクトに対してこのメソッドを実装する方法を示しています。 この例では、解析される式を環境変数の名前と見なし、その変数から値を取得します。

HRESULT CEnvBlock::ParseText(
    LPCOLESTR           pszCode,
    PARSEFLAGS          dwFlags,
    UINT                nRadix,
    IDebugExpression2 **ppExpr,
    BSTR               *pbstrError,
    UINT               *pichError)
{
    HRESULT hr = E_OUTOFMEMORY;
    // Create an integer variable with a value equal to one plus
    // twice the length of the passed expression to be parsed.
    int iAnsiLen      = 2 * (wcslen(pszCode)) + 1;
    // Allocate a character string of the same length.
    char *pszAnsiCode = (char *) malloc(iAnsiLen);

    // Check for successful memory allocation.
    if (pszAnsiCode) {
        // Map the wide-character pszCode string to the new pszAnsiCode character string.
        WideCharToMultiByte(CP_ACP, 0, pszCode, -1, pszAnsiCode, iAnsiLen, NULL, NULL);
        // Check to see if the app can successfully get the environment variable.
        if (GetEnv(pszAnsiCode)) {

            // Create and initialize a CExpression object.
            CComObject<CExpression> *pExpr;
            CComObject<CExpression>::CreateInstance(&pExpr);
            pExpr->Init(pszAnsiCode, this, NULL);

            // Assign the pointer to the new object to the passed argument
            // and AddRef the object.
            *ppExpr = pExpr;
            (*ppExpr)->AddRef();
            hr = S_OK;
        // If the program cannot successfully get the environment variable.
        } else {
            // Set the errror message and return E_FAIL.
            *pbstrError = SysAllocString(L"No such environment variable.");
            hr = E_FAIL;
        }
        // Free the local character string.
        free(pszAnsiCode);
    }
    return hr;
}

関連項目