1

如果我有[in,out] BSTR*参数并且我想修改字符串内容但仍保持相同的长度,我可以重复使用它还是需要重新分配/释放并分配BSTR

MSDN 说

对于[in, out]参数,调用者分配内存,方法或属性可以选择性地解除分配和重新分配,调用者最终负责删除内存。

为了更完整,什么时候是可选的?

4

1 回答 1

1

什么时候是可选的

它表示调用者负责提供有效参数(并在必要时分配内存)。

方法(被调用者)也负责为参数保留有效值。也就是说,它可以自行决定将现有值保留在原处,或者,当方法出于任何原因需要更改参数时,可以选择将值更改为另一个值更改可分配值意味着应该取消(解除分配)旧分配并以相同方式进行新分配,以便接收此值的调用者在不再需要该值时可以安全地解除分配。

输入/输出字符串参数如下所示。在第一次执行时,它会增加输入值的第一个字符而不重新分配,然后它将用新的值替换该值:

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"
于 2013-06-06T18:49:56.467 回答