Exemplo de implementação de avaliação de expressão
Para um Watch expressão de janela, chamadas de Visual Studio IDebugExpressionContext2::ParseText para produzir um IDebugExpression2 objeto. IDebugExpressionContext2::ParseTextinstancia um avaliador de expressão (EE) e chamadas IDebugExpressionEvaluator::Parse para obter um IDebugParsedExpression objeto.
Essa implementação do IDebugExpressionEvaluator::Parse realiza as seguintes tarefas:
[Apenas C++] Analisa a expressão em busca de erros.
Instancia uma classe (chamado CParsedExpression neste exemplo) que implementa o IDebugParsedExpression interface e o armazena na classe a expressão a ser analisado.
Retorna o IDebugParsedExpression interface a partir de CParsedExpression objeto.
Dica
Nos exemplos a seguir e a amostra de MyCEE, o avaliador da expressão não separa a análise da avaliação.
Código gerenciado
Esta é uma implementação de IDebugExpressionEvaluator::Parse em código gerenciado. Observe que esta versão do método adia a análise para IDebugParsedExpression::EvaluateSync como analisar o código também avalia ao mesmo tempo (consulte Avaliar uma expressão de inspeção).
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;
}
}
}
Código não gerenciado
Esta é uma implementação de IDebugExpressionEvaluator::Parse em código não gerenciado. Este método chama uma função auxiliar, Parse, para analisar a expressão e a verificação de erros, mas este método ignora o valor resultante. A avaliação formal é adiada para IDebugParsedExpression::EvaluateSync onde está a analisar a expressão enquanto ele é avaliado (consulte Avaliar uma expressão de inspeção).
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;
}