我们有如下界面:
[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]
参数?
最佳答案
您应该期望客户端遵循契约(Contract),遵守 [out] 属性并且不传递需要释放的已初始化 BSTR。仔细检查并期待 NULL 是不好吧,合约不要求客户端传递指向已初始化内存位置的指针。您通常会得到一个指向分配在堆栈帧上的 BSTR 变量的指针。它可能包含随机垃圾,只有防御性程序员才会将其设置为 NULL。
它在其他方面与 OLE 自动化不兼容。只有 [out,retval] 和 [in,out] 在这种情况下有效,无疑可以避免这个特殊的陷阱。
关于windows - COM 服务器是否必须为 [out] 参数调用 SysFreeString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729007/