windows – COM服务器是否必须为[out]参数调用SysFreeString()?
发布时间:2020-12-14 01:58:29 所属栏目:Windows 来源:网络整理
导读:我们有以下界面: [object,uuid("uuidhere"),dual ]interface IInterface : IDispatch{ [id(1),propget] HRESULT CoolProperty( [out,retval] BSTR* result );} 现在有一个小问题.一方面参数是“out”,因此任何值都可以作为输入传递,参数只有在成功返回时才
我们有以下界面:
[object,uuid("uuidhere"),dual ] interface IInterface : IDispatch { [id(1),propget] HRESULT CoolProperty( [out,retval] BSTR* result ); } 现在有一个小问题.一方面参数是“out”,因此任何值都可以作为输入传递,参数只有在成功返回时才会生效.另一方面,有很多页面链接到this MSDN article,基本上说(最后一段)如果任何函数传递给BSTR *它必须在分配新字符串之前释放字符串. 那太可怕了.如果该文章是正确的,则意味着所有调用者必定必须传递有效的BSTR(可能为空BSTR),否则BSTR传递可能会被泄露.如果调用者传递了一个随机值并且被调用者试图调用SysFreeString(),则会遇到未定义的行为,因此约定很关键. 那么[out]属性的重点是什么?在这种情况下,[in,out]和[out]之间有什么区别? 这篇文章对吗?在分配新参数之前,是否需要释放传递的BSTR [out]参数? 解决方法
您应该期望客户端遵循合同,遵守[out]属性并且不传递需要被释放的初始化BSTR.仔细检查并期望NULL不合适,合同不要求客户端将指针传递给初始化的内存位置.您通常会获得指向堆栈帧上分配的BSTR变量的指针.它可能包含随机垃圾,只有防守程序员才会将其设置为NULL.
否则它与OLE自动化不兼容.在这种情况下,只有[out,retval]和[in,out]有效,毫无疑问要避免这个特殊的陷阱. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |