gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:23:20 26 4
gpt4 key购买 nike

我们有如下界面:

[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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com