Implementazione dell'esempio di valutazione di espressioni
Per un'espressione della finestra di espressione di controllo , chiamate IDebugExpressionContext2:: ParseText di Visual Studio per IDebugExpression2 produrre un oggetto. IDebugExpressionContext2::ParseText creare un'istanza di un (EE) analizzatore di espressioni e IDebugExpressionEvaluator:: Di traccia chiama per IDebugParsedExpression ottenere un oggetto.
Questa implementazione di IDebugExpressionEvaluator::Parse esegue le attività seguenti:
[C++ solo] analizza l'espressione per individuare gli errori.
Creare un'istanza di una classe (chiamata CParsedExpression in questo esempio) che implementa l'interfaccia e gli archivi di IDebugParsedExpression nella classe l'espressione da analizzare.
Restituisce l'interfaccia di IDebugParsedExpression dall'oggetto di CParsedExpression .
Nota
Negli esempi che seguono e nell'esempio di MyCEE, l'analizzatore di espressioni non consente l'analisi dalla valutazione.
Codice gestito
Si tratta di un'implementazione di IDebugExpressionEvaluator::Parse nel codice gestito. Si noti che questa versione del metodo rinvia tracciatura a IDebugParsedExpression:: EvaluateSync quando il codice per analizzare anche valuta contemporaneamente (vedere Valutazione di un'espressione espressioni di controllo).
namespace EEMC
{
public class CParsedExpression : IDebugParsedExpression
{
public HRESULT Parse(
string expression,
uint parseFlags,
uint radix,
out string errorMessage,
out uint errorPosition,
out IDebugParsedExpression parsedExpression)
{
errorMessage = "";
errorPosition = 0;
parsedExpression =
new CParsedExpression(parseFlags, radix, expression);
return COM.S_OK;
}
}
}
codice non gestito
Si tratta di un'implementazione di IDebugExpressionEvaluator::Parse nel codice non gestito. Questo metodo chiama una funzione di supporto, Parse, analizzare l'espressione e il controllo degli errori ma questo metodo ignora il valore risultante. La valutazione formale è IDebugParsedExpression:: EvaluateSync rinviata a cui l'espressione viene analizzata mentre viene valutata (vedere Valutazione di un'espressione espressioni di controllo).
STDMETHODIMP CExpressionEvaluator::Parse(
in LPCOLESTR pszExpression,
in PARSEFLAGS flags,
in UINT radix,
out BSTR *pbstrErrorMessages,
inout UINT *perrorCount,
out IDebugParsedExpression **ppparsedExpression
)
{
if (pbstrErrorMessages == NULL)
return E_INVALIDARG;
else
*pbstrErrormessages = 0;
if (pparsedExpression == NULL)
return E_INVALIDARG;
else
*pparsedExpression = 0;
if (perrorCount == NULL)
return E_INVALIDARG;
HRESULT hr;
// Look for errors in the expression but ignore results
hr = ::Parse( pszExpression, pbstrErrorMessages );
if (hr != S_OK)
return hr;
CParsedExpression* pparsedExpr = new CParsedExpression( radix, flags, pszExpression );
if (!pparsedExpr)
return E_OUTOFMEMORY;
hr = pparsedExpr->QueryInterface( IID_IDebugParsedExpression,
reinterpret_cast<void**>(ppparsedExpression) );
pparsedExpr->Release();
return hr;
}