Exemple d'implémentation d'évaluation de l'expression
Pour une expression de la fenêtre d' Espion , Visual Studio appelle IDebugExpressionContext2 : : ParseText pour produire un objet d' IDebugExpression2 . IDebugExpressionContext2::ParseText instancie un évaluateur d'expression (EE) et appelle IDebugExpressionEvaluator : : analysez pour obtenir un objet d' IDebugParsedExpression .
cette implémentation d' IDebugExpressionEvaluator::Parse effectue les tâches suivantes :
[C++] analyse uniquement l'expression à rechercher des erreurs.
Instancie une classe ( CParsedExpression appelé par exemple) qui implémente l'interface d' IDebugParsedExpression et stocker dans la classe l'expression à analyser.
Retourne l'interface d' IDebugParsedExpression de l'objet d' CParsedExpression .
Notes
Dans les exemples qui suivent et dans l'exemple de MyCEE, l'évaluateur d'expression ne sépare pas de l'évaluation.
Code managé
Il s'agit d'une implémentation d' IDebugExpressionEvaluator::Parse en code managé. Notez que cette version de la méthode diffère l'analyse à IDebugParsedExpression : : EvaluateSync à mesure que le code pour analyser également a en même temps (voir l' Évaluer une expression espionne).
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;
}
}
}
Le code non managé
Il s'agit d'une implémentation d' IDebugExpressionEvaluator::Parse dans du code non managé. Cette méthode appelle une fonction d'assistance, Parse, analyser l'expression et vérifier les erreurs mais cette méthode rejette la valeur résultante. L'évaluation formelle est différée jusqu'à IDebugParsedExpression : : EvaluateSync où l'expression est analysée pendant qu'elle est évaluée (voir l' Évaluer une expression espionne).
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;
}