Compartir a través de


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:

  1. [Solo C++] Analiza la expresión para buscar errores.

  2. Crea una instancia de una clase (denominada CParsedExpression en este ejemplo) que ejecuta la interfaz IDebugParsedExpression y almacena en la clase la expresión que se va a analizar.

  3. Devuelve la interfaz IDebugParsedExpression desde el objeto CParsedExpression.

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;
}

Consulte también