IDebugProperty3:: SetValueAsStringWithError
Imposta il valore di questa proprietà e restituisce un messaggio di errore, se necessario.
HRESULT SetValueAsStringWithError(
LPCOLESTR pszValue,
DWORD dwRadix,
DWORD dwTimeout,
BSTR* errorString
);
int SetValueAsStringWithError(
string pszValue,
uint dwRadix,
uint dwTimeout,
out string errorString
);
Parametri
pszValue
[in] Valore da impostare.dwRadix
[in] La radice del valore impostato.dwTimeout
[in] La durata del valore da impostare (mezzo diINFINITE attesa di sempre).errorString
[out] Se si è verificato un errore che imposta il valore, questo viene utilizzato il motivo dell'errore.
Valore restituito
Se l'operazione riesce, restituisce S_OK; in caso contrario, restituisce un codice di errore.
Note
Il valore in ingresso può essere un'espressione da valutare.
Esempio
Nell'esempio seguente viene illustrato come implementare questo metodo per un oggetto di CProperty che espone IDebugProperty3 l'interfaccia.
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;
}