COM服务器是否必须为[out]参数调用SysFreeString()?

sha*_*oth 6 windows com interop visual-c++

我们有以下界面:

[object, uuid("uuidhere"), dual ]
interface IInterface : IDispatch
{
    [id(1), propget] HRESULT CoolProperty( [out, retval] BSTR* result );
}
Run Code Online (Sandbox Code Playgroud)

现在有一个小问题.一方面参数是"out",因此任何值都可以作为输入传递,参数只有在成功返回时才会生效.另一方面,这篇MSDN文章链接到许多页面,基本上说(最后一段)如果传递任何函数,BSTR*它必须在分配新字符串之前释放字符串.

那太可怕了.如果该文章是正确的,则意味着所有调用者必定必须传递有效的BSTR(可能为空BSTR),否则BSTR传递可能会被泄露.如果调用者传递了一个随机值并且被调用者试图调用SysFreeString()它会遇到未定义的行为,那么约定是至关重要的.

那么[out]属性中的重点是什么?这种情况[in, out][out]这种情况有什么区别?

这篇文章对吗?[out]在分配新参数之前,是否需要释放传递的BSTR 参数?

Han*_*ant 4

您应该期望客户端遵循合同,遵守 [out] 属性,并且不传递需要释放的初始化 BSTR。双重检查并期望 NULL 是不行的,合约不要求客户端传递指向已初始化内存位置的指针。您通常会获得一个指向在堆栈帧上分配的 BSTR 变量的指针。它很可能包含随机垃圾,只有防御性程序员才会将其设置为 NULL。

否则它与 OLE 自动化不兼容。在这种情况下,只有 [out,retval] 和 [in,out] 有效,无疑可以避免这个特定的陷阱。