Beispielimplementierung der Ausdrucksauswertung
Wichtig
Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.
Für einen Watch-Fensterausdruck ruft Visual Studio ParseText auf, um ein IDebugExpression2-Objekt zu erzeugen. IDebugExpressionContext2::ParseText
instanziiert eine Ausdrucksauswertung (EE) und ruft Parse auf, um ein IDebugParsedExpression-Objekt zu erhalten.
IDebugExpressionEvaluator::Parse
führt die folgenden Aufgaben aus:
[Nur C++ ] Analysiert den Ausdruck, um nach Fehlern zu suchen.
Instanziiert eine Klasse (
CParsedExpression
in diesem Beispiel), die dieIDebugParsedExpression
-Schnittstelle ausführt und in der Klasse den zu analysierenden Ausdruck speichert.Gibt die
IDebugParsedExpression
Schnittstelle aus demCParsedExpression
-Objekt zurück.
Hinweis
In den folgenden Beispielen und im MyCEE-Beispiel trennt die Ausdrucksauswertung die Analyse nicht von der Auswertung.
Verwalteter Code
Der folgende Code zeigt eine Implementierung von IDebugExpressionEvaluator::Parse
in verwaltetem Code. Diese Version der Methode überträgt die Analyse auf EvaluateSync, da der Code für die Analyse ebenfalls gleichzeitig ausgewertet wird (siehe Auswertung eines Watch-Ausdrucks).
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;
}
}
}
Nicht verwalteter Code
Der folgende Code zeigt eine Implementierung von IDebugExpressionEvaluator::Parse
in nicht verwaltetem Code. Diese Methode ruft die Hilfsfunktion Parse
auf, um den Ausdruck zu analysieren und auf Fehler zu überprüfen, aber diese Methode ignoriert den resultierenden Wert. Die formale Auswertung wird auf EvaluateSync übertragen, wo der Ausdruck analysiert wird, während er ausgewertet wird (siehe Auswertung eines Watch-Ausdrucks).
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;
}