Sdílet prostřednictvím


IDebugExpressionContext2::ParseText

Parsuje výraz v textové podobě pro pozdější vyhodnocení.

Syntaxe

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

Parametry

pszCode
[v] Výraz, který se má analyzovat.

dwFlags
[v] Kombinace příznaků z výčtu PARSEFLAGS , která řídí analýzu.

nRadix
[v] Radix, který má být použit při analýze libovolných číselných informací v pszCode.

ppExpr
[ven] Vrátí IDebugExpression2 objekt, který představuje parsovaný výraz, který je připravený pro vazbu a vyhodnocení.

pbstrError
[ven] Vrátí chybovou zprávu, pokud výraz obsahuje chybu.

pichError
[ven] Vrátí index znaků chyby v pszCode případě, že výraz obsahuje chybu.

Vrácená hodnota

V případě úspěchu vrátí hodnotu S_OK; v opačném případě vrátí kód chyby.

Poznámky

Při volání této metody by ladicí modul (DE) měl analyzovat výraz a ověřit jeho správnost. Parametry pbstrError a pichError parametry mohou být vyplněny, pokud je výraz neplatný.

Všimněte si, že výraz není vyhodnocen, pouze analyzován. Pozdější volání metod EvaluateSync nebo EvaluateAsync vyhodnotí analyzovaný výraz.

Příklad

Následující příklad ukazuje, jak implementovat tuto metodu pro jednoduchý CEnvBlock objekt, který zveřejňuje IDebugExpressionContext2 rozhraní. Tento příklad považuje výraz za parsovaný jako název proměnné prostředí a načte hodnotu z této proměnné.

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

Viz také