Implementación de ejemplo de la evaluación de expresiones
Importante
En Visual Studio 2015, esta forma de implementar evaluadores de expresiones está en desuso. Para obtener información sobre cómo implementar evaluadores de expresiones CLR, vea Evaluadores de expresiones CLR y Ejemplo de evaluador de expresiones administradas.
Para una expresión de la ventana Inspección, Visual Studio llama a ParseText a fin de generar un objeto IDebugExpression2. IDebugExpressionContext2::ParseText
crea una instancia de un evaluador de expresiones (EE) y llama a Parse para obtener un objeto IDebugParsedExpression.
IDebugExpressionEvaluator::Parse
realiza las tareas siguientes:
[Solo C++] Analiza la expresión para buscar errores.
Crea una instancia de una clase (denominada
CParsedExpression
en este ejemplo) que ejecuta la interfazIDebugParsedExpression
y almacena en la clase la expresión que se va a analizar.Devuelve la interfaz
IDebugParsedExpression
desde el objetoCParsedExpression
.
Nota:
En los ejemplos siguientes y en el de MyCEE, el evaluador de expresiones no separa el análisis de la evaluación.
Código administrado
En el código siguiente se muestra una implementación de IDebugExpressionEvaluator::Parse
en código administrado. Esta versión del método difiere el análisis a EvaluateSync, ya que el código para analizar también se evalúa al mismo tiempo (vea Evaluación de una expresión de Inspección).
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 no administrado
El código siguiente es una implementación de IDebugExpressionEvaluator::Parse
en código no administrado. Este método llama a una función auxiliar, Parse
, para analizar la expresión y comprobar si hay errores, pero este método omite el valor resultante. La evaluación formal se difiere a EvaluateSync, donde se analiza la expresión mientras se evalúa (vea Evaluación de una expresión de inspección).
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;
}