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

标签 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* 它必须在分配新字符串之前释放字符串。

太可怕了。如果那篇文章是正确的,则意味着所有调用者都必须确保传递有效的 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/

相关文章:

c++ - 如何检测 Visual C++ 中的 rdtscp 支持?

visual-c++ - 混合模式程序集未加载 native C++ pdb 的符号

com - Windows 64 位注册表对比32位注册表

c++ - CComPtr 和引用计数

c# - 如何使用您的应用程序打开 jpg 文件?

windows - TokenUser 和 TokenOwner 的区别

c++ - 在 VS6 中批量更改项目构建配置

java - 如何在 Linux (Ubuntu) 中使用 COM

c++ - 无条件终止进程 (Windows)

Windows 批处理 : echo a multi-line variable with special characters (JiraRelease Notes from jenkins)