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

时间:2010-04-28 11:34:11

标签: windows visual-c++ com interop

我们有以下界面:

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

documentation表示OUT指针永远不会被被调用者释放,所以,恕我直言,你最好遵守规范。

最佳