IDebugProperty3::SetValueAsStringWithError
Nastaví hodnotu této vlastnosti a v případě potřeby vrátí chybovou zprávu.
Syntaxe
int SetValueAsStringWithError(
string pszValue,
uint dwRadix,
uint dwTimeout,
out string errorString
);
Parametry
pszValue
[v] Hodnota, kterou chcete nastavit.
dwRadix
[v] Radix množiny hodnot.
dwTimeout
[v] Doba čekání na nastavenou hodnotu (INFINITE
znamená čekání na věky).
errorString
[ven] Pokud došlo k chybě s nastavením hodnoty, bude to obsahovat důvod selhání.
Vrácená hodnota
V případě úspěchu vrátí hodnotu S_OK
; v opačném případě vrátí kód chyby.
Poznámky
Příchozí hodnotou může být výraz, který se má vyhodnotit.
Příklad
Následující příklad ukazuje, jak implementovat tuto metodu pro CProperty objekt, který zveřejňuje IDebugProperty3 rozhraní.
HRESULT CProperty::SetValueAsStringWithError(
LPCOLESTR in_szValue,
DWORD in_RADIX,
DWORD in_TIMEOUT,
BSTR * out_ERRORTEXT
)
{
// precondition
REQUIRE( NULL != in_szValue );
if (NULL == in_szValue)
return E_INVALIDARG;
INVARIANT( this );
if (!this->ClassInvariant())
return E_UNEXPECTED;
if (NULL == m_pPropertyContext->m_pCEE->m_LanguageSpecificUseCases.pfSetValue)
return S_OK;
// function body
DEBUG_PROPERTY_INFO dpInfo,dpInfo2;
HRESULT HR = this->GetPropertyInfo(DEBUGPROP_INFO_FULLNAME | DEBUGPROP_INFO_ATTRIB | DEBUGPROP_INFO_TYPE | DEBUGPROP_INFO_VALUE_AUTOEXPAND,
in_RADIX,
in_TIMEOUT,
NULL,
0,
&dpInfo);
if (ENSURE( S_OK == HR ))
{
REQUIRE( NULL != dpInfo.bstrFullName );
REQUIRE( NULL != dpInfo.bstrType );
REQUIRE( NULL == dpInfo.bstrName );
REQUIRE( NULL == dpInfo.bstrValue );
REQUIRE( NULL == dpInfo.pProperty );
BSTR bstrError = NULL;
UINT ichError = 0;
IDebugProperty2* pProperty = NULL;
IDebugParsedExpression* pParsedExpression = NULL;
CComBSTR bstrValue = dpInfo.bstrFullName;
bstrValue += L" = ";
bstrValue += in_szValue;
HR = this->m_pPropertyContext->m_pCEE->
Parse(bstrValue, 0, in_RADIX, &bstrError, &ichError, &pParsedExpression);
if (S_OK == HR)
{
REQUIRE( NULL == bstrError );
HR = pParsedExpression->EvaluateSync(EVAL_NOEVENTS | EVAL_RETURNVALUE,
in_TIMEOUT,
m_pPropertyContext->m_pSymbolProvider,
m_pPropertyContext->m_pAddress,
m_pPropertyContext->m_pBinder,
NULL,
&pProperty);
dpInfo2.dwAttrib = DBG_ATTRIB_VALUE_ERROR;
if (pProperty)
{
pProperty->GetPropertyInfo(DEBUGPROP_INFO_ATTRIB | DEBUGPROP_INFO_VALUE,10,in_TIMEOUT,NULL,0,&dpInfo2);
}
if (DBG_ATTRIB_VALUE_ERROR & dpInfo2.dwAttrib)
{
HR = E_FAIL;
bstrError = dpInfo2.bstrValue;
}
else
{
::SysFreeString(dpInfo.bstrValue);
}
EXTERNAL_RELEASE(pProperty);
EXTERNAL_RELEASE(pParsedExpression);
}
if (bstrError)
{
if(out_ERRORTEXT)
{
*out_ERRORTEXT = bstrError;
bstrError = NULL;
}
else
{
::SysFreeString(bstrError);
}
}
::SysFreeString(dpInfo.bstrFullName);
::SysFreeString(dpInfo.bstrType);
}
// postcondition
INVARIANT( this );
return HR;
}