IDebugProperty3::SetValueAsStringWithError
Applies to: Visual Studio Visual Studio for Mac
Note
This article applies to Visual Studio 2017. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
Sets the value of this property and returns an error message, if necessary.
Syntax
HRESULT SetValueAsStringWithError(
LPCOLESTR pszValue,
DWORD dwRadix,
DWORD dwTimeout,
BSTR* errorString
);
int SetValueAsStringWithError(
string pszValue,
uint dwRadix,
uint dwTimeout,
out string errorString
);
Parameters
pszValue
[in] Value to set.
dwRadix
[in] The radix of the value being set.
dwTimeout
[in] The length of time to wait for the value to be set (INFINITE
means wait forever).
errorString
[out] If there was an error setting the value, this holds the reason for the failure.
Return Value
If successful, returns S_OK
; otherwise, returns an error code.
Remarks
The incoming value could be an expression to be evaluated.
Example
The following example shows how to implement this method for a CProperty object that exposes the IDebugProperty3 interface.
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;
}