如果我有[in,out] BSTR*
参数并且我想修改字符串内容但仍保持相同的长度,我可以重复使用它还是需要重新分配/释放并分配BSTR
?
对于
[in, out]
参数,调用者分配内存,方法或属性可以选择性地解除分配和重新分配,调用者最终负责删除内存。
为了更完整,什么时候是可选的?
什么时候是可选的
它表示调用者负责提供有效参数(并在必要时分配内存)。
方法(被调用者)也负责为参数保留有效值。也就是说,它可以自行决定将现有值保留在原处,或者,当方法出于任何原因需要更改参数时,可以选择将值更改为另一个值。更改可分配值意味着应该取消(解除分配)旧分配并以相同方式进行新分配,以便接收此值的调用者在不再需要该值时可以安全地解除分配。
输入/输出字符串参数如下所示。在第一次执行时,它会增加输入值的第一个字符而不重新分配,然后它将用新的值替换该值:
STDMETHOD(Method)(/* [in, out] */ BSTR* psValue) throw()
{
if(!psValue)
return E_POINTER;
static INT g_nCounter = 0;
if(++g_nCounter > 1)
{
// Deallocate old, Allocate new
SysFreeString(*psValue);
*psValue = SysAllocString(L"New Value");
} else
{
// No Re-allocation
if(SysStringLen(*psValue) > 0)
(*psValue)[0]++;
}
return S_OK;
}
基于 ATL 的代码可能看起来更好一些:
STDMETHOD(Method)(BSTR* psValue) throw()
{
_ATLTRY
{
ATLENSURE_THROW(psValue, E_POINTER);
CComBSTR& sValue = reinterpret_cast<CComBSTR&>(*psValue);
static INT g_nCounter = 0;
if(++g_nCounter > 1)
{
sValue = _T("New Value");
} else
{
if(sValue.Length() > 1)
sValue[0]++;
}
}
_ATLCATCH(Exception)
{
return Exception;
}
return S_OK;
}
调用方代码可能是这样的:
CComBSTR sValue = _T("Old Value");
Method(&sValue);
CComBSTR sValueA = sValue; // Gets you "Pld Value"
Method(&sValue);
CComBSTR sValueB = sValue; // Gets you "New Value"