Partilhar via


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:

  1. [Apenas C++] Analisa a expressão em busca de erros.

  2. Instancia uma classe (chamado CParsedExpression neste exemplo) que implementa o IDebugParsedExpression interface e o armazena na classe a expressão a ser analisado.

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

Consulte também

Conceitos

Avaliar uma expressão de janela de inspeção

Avaliar uma expressão de inspeção