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