IDebugExpressionContext2::ParseText

Analiza una expresión en formato de texto para su evaluación posterior.

Sintaxis

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

Parámetros

pszCode
[in] Expresión que se va a analizar.

dwFlags
[in] Combinación de marcas de la enumeración PARSEFLAGS que controla el análisis.

nRadix
[in] Radix que se va a usar para analizar cualquier información numérica de pszCode.

ppExpr
[out] Devuelve el objeto IDebugExpression2 que representa la expresión analizada, que está lista para el enlace y la evaluación.

pbstrError
[out] Devuelve el mensaje de error si la expresión contiene un error.

pichError
[out] Devuelve el índice de caracteres del error en pszCode si la expresión contiene un error.

Valor devuelto

Si la operación se realiza correctamente, devuelve S_OK; de lo contrario, devuelve un código de error.

Comentarios

Cuando se llama a este método, un motor de depuración (DE) debe analizar la expresión y validarla para que sea correcta. Los pbstrError parámetros y pichError se pueden rellenar si la expresión no es válida.

Tenga en cuenta que la expresión no se evalúa, solo se analiza. Una llamada posterior a los métodos EvaluateSync o EvaluateAsync evalúa la expresión analizada.

Ejemplo

En el ejemplo siguiente se muestra cómo implementar este método para un objeto simple CEnvBlock que expone la interfaz IDebugExpressionContext2 . En este ejemplo se considera que la expresión se va a analizar como el nombre de una variable de entorno y recupera el valor de esa variable.

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

Consulte también