Implementação amostral da avaliação da expressão
Importante
No Visual Studio 2015, essa maneira de implementar avaliadores de expressão foi preterida. Para obter informações sobre como implementar avaliadores de expressão CLR, consulte Avaliadores de expressão CLR e Exemplo de avaliador de expressão gerenciada.
Para uma expressão de janela de inspeção , o Visual Studio chama ParseText para produzir um objeto IDebugExpression2 . IDebugExpressionContext2::ParseText
instancia um avaliador de expressão (EE) e chama Parse para obter um objeto IDebugParsedExpression .
O IDebugExpressionEvaluator::Parse
executa as seguintes tarefas:
[Somente C++] Analisa a expressão para procurar erros.
Instancia uma classe (chamada
CParsedExpression
neste exemplo) que executa a interface e armazena na classe a expressão aIDebugParsedExpression
ser analisada.Retorna a
IDebugParsedExpression
interface doCParsedExpression
objeto.
Observação
Nos exemplos a seguir e no exemplo MyCEE, o avaliador da expressão não separa a análise da avaliação.
Código gerenciado
O código a seguir mostra uma implementação de IDebugExpressionEvaluator::Parse
no código gerenciado. Esta versão do método adia a análise para EvaluateSync, pois o código para análise também é avaliado 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
O código a seguir é uma implementação de IDebugExpressionEvaluator::Parse
em código não gerenciado. Esse método chama uma função auxiliar, , para analisar a expressão e verificar erros, Parse
mas esse método ignora o valor resultante. A avaliação formal é adiada para EvaluateSync , onde a expressão é analisada enquanto é avaliada (consulte Avaliar uma expressão de observaçã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;
}