Exemple d’implémentation de l’évaluation des expressions
Important
Dans Visual Studio 2015, cette façon d’implémenter des évaluateurs d’expression est déconseillée. Pour plus d’informations sur l’implémentation d’évaluateurs d’expression CLR, consultez l’exemple d’évaluateur d’expression CLR et d’évaluateur d’expression managée.
Pour une expression de fenêtre Watch , Visual Studio appelle ParseText pour produire un objet IDebugExpression2 . IDebugExpressionContext2::ParseText
instancie un évaluateur d’expression (EE) et appelle Parse pour obtenir un objet IDebugParsedExpression .
Les IDebugExpressionEvaluator::Parse
tâches suivantes sont effectuées :
[C++ uniquement] Analyse l’expression pour rechercher des erreurs.
Instancie une classe (appelée
CParsedExpression
dans cet exemple) qui exécute l’interfaceIDebugParsedExpression
et stocke dans la classe l’expression à analyser.Retourne l’interface
IDebugParsedExpression
de l’objetCParsedExpression
.
Remarque
Dans les exemples qui suivent et dans l’exemple MyCEE, l’évaluateur d’expression ne sépare pas l’analyse de l’évaluation.
Code managé
Le code suivant montre une implémentation dans IDebugExpressionEvaluator::Parse
le code managé. Cette version de la méthode reporte l’analyse à EvaluateSync en tant que code pour l’analyse évalue également en même temps (voir Évaluer une expression Watch).
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;
}
}
}
Code non managé
Le code suivant est une implémentation du IDebugExpressionEvaluator::Parse
code non managé. Cette méthode appelle une fonction d’assistance, Parse
pour analyser l’expression et case activée pour les erreurs, mais cette méthode ignore la valeur résultante. L’évaluation formelle est différée à EvaluateSync où l’expression est analysée pendant qu’elle est évaluée (voir Évaluer une expression Watch).
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;
}