加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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]有效,毫无疑问要避免这个特殊的陷阱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读