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