我们有以下界面:
[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]
参数?
答案 0 :(得分:4)
您应该期望客户端遵循合同,尊重[out]属性并且不传递需要被释放的初始化BSTR。仔细检查并期望NULL 不好,合同不要求客户端将指针传递给初始化的内存位置。您通常会获得指向堆栈帧上分配的BSTR变量的指针。它可能包含随机垃圾,只有防守程序员会将其设置为NULL。
否则它与OLE自动化不兼容。在这种情况下,只有[out,retval]和[in,out]有效,毫无疑问可以避免这种特殊陷阱。
答案 1 :(得分:4)
documentation表示OUT指针永远不会被被调用者释放,所以,恕我直言,你最好遵守规范。
最佳