Пример реализации вычисления выражений
Для a Контрольное значение выражение окна, вызовы Visual Studio IDebugExpressionContext2::ParseText создать IDebugExpression2 объект. IDebugExpressionContext2::ParseText создает средство оценки выражений (EE) и вызовы IDebugExpressionEvaluator::Parse доступ IDebugParsedExpression объект.
Эта реализация IDebugExpressionEvaluator::Parse выполняет следующие задачи:
[C++] только анализирует выражение для поиска ошибки.
Создает класс с именем " ( CParsedExpression в этом примере) этом реализует IDebugParsedExpression интерфейс и сохраняет в классе выражение, которое необходимо проанализировать.
Возвращает IDebugParsedExpression интерфейс из CParsedExpression объект.
Примечание
В примерах, приведенных ниже, и в образце MyCEE, средство оценки выражений не разделяет анализ из вычислений.
Управляемый код
Эта реализация IDebugExpressionEvaluator::Parse в управляемом коде. Обратите внимание, что данная версия метода parse к откладывает IDebugParsedExpression::EvaluateSync по мере того, как код для анализа также является одновременно (см. Вычисление выражения контрольное значение).
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;
}
}
}
Неуправляемый код
Эта реализация IDebugExpressionEvaluator::Parse в неуправляемом коде. Этот метод вызывает вспомогательную функцию, Parse, выполнить синтаксический анализ выражения и проверка ошибок, но этого метода не учитывает результирующее значение. Оценка отложена к формальным IDebugParsedExpression::EvaluateSync где синтаксическом анализе выражения, пока его вычисления (см. Вычисление выражения контрольное значение).
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;
}