IDebugExpressionContext2::ParseText

分析文本形式的表达式以供以后计算。

语法

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

参数

pszCode
[in]要分析的表达式。

dwFlags
[in]PAR标准版FLAGS 枚举中控制分析的标志的组合。

nRadix
[in]要用于分析任何数值信息的 pszCode基数。

ppExpr
[out]返回 表示已分析表达式的 IDebugExpression2 对象,该表达式已准备好进行绑定和计算。

pbstrError
[out]如果表达式包含错误,则返回错误消息。

pichError
[out]如果表达式包含错误,则返回错误的 pszCode 字符索引。

返回值

如果成功,则返回 S_OK;否则,返回错误代码。

注解

调用此方法时,调试引擎(DE)应分析表达式并验证表达式是否正确。 pbstrError如果表达式无效,可以填充参数pichError

请注意,不计算表达式,仅分析表达式。 稍后对 EvaluateSyncEvaluateAsync 方法的调用将计算已分析的表达式。

示例

以下示例演示如何为公开 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;
}

另请参阅