Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważne
W programie Visual Studio 2015 ten sposób implementowania ewaluatorów wyrażeń jest przestarzały. Aby uzyskać informacje na temat implementowania ewaluatorów wyrażeń CLR, zobacz CLR expression evaluators and Managed expression evaluator Sample (Przykład ewaluatora wyrażeń zarządzanych).
W przypadku wyrażenia okna watch program Visual Studio wywołuje metodę ParseText w celu utworzenia obiektu IDebugExpression2. IDebugExpressionContext2::ParseTexttworzy wystąpienie ewaluatora wyrażeń (EE) i wywołuje metodę Parse, aby uzyskać obiekt IDebugParsedExpression.
Program IDebugExpressionEvaluator::Parse wykonuje następujące zadania:
[Tylko C++ ] Analizuje wyrażenie, aby wyszukać błędy.
Tworzy wystąpienie klasy (nazywanej
CParsedExpressionw tym przykładzie), która uruchamiaIDebugParsedExpressioninterfejs i przechowuje w klasie wyrażenie do przeanalizowania.IDebugParsedExpressionZwraca interfejs zCParsedExpressionobiektu .
Uwaga
W poniższych przykładach i w przykładzie MyCEE ewaluator wyrażeń nie oddziela analizy od oceny.
Kod zarządzany
Poniższy kod przedstawia implementację kodu zarządzanego IDebugExpressionEvaluator::Parse . Ta wersja metody wyzywuje analizowanie wartości EvaluateSync jako kodu do analizowania jest również obliczane w tym samym czasie (zobacz Ocena wyrażenia zegarka).
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;
}
}
}
Niezarządzany kod
Poniższy kod jest implementacją IDebugExpressionEvaluator::Parse kodu niezarządzanego. Ta metoda wywołuje funkcję pomocnika, Parse, aby przeanalizować wyrażenie i sprawdzić błędy, ale ta metoda ignoruje wynikową wartość. Formalna ocena jest odroczona do funkcji EvaluateSync , gdzie wyrażenie jest analizowane podczas jego obliczania (zobacz Ocena wyrażenia zegarka).
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;
}