调用者是否需要释放通过未记录的 WM_GETISHELLBROWSER (WM_USER+7) 消息获得的 IShellBrowser*?

StackOverflow https://stackoverflow.com/questions/1909853

  •  19-09-2019
  •  | 
  •  

一些人指出,存在一条未记录的消息,该消息从文件打开和保存对话框的公共对话框 HWND 中检索 IShellBrowser 接口指针。

但是关于该指针是否是 AddRef'd,或者它是否只是返回的原始地址,并且不应该对其调用 Release() ,存在冲突信息(或没有信息)?

有帮助吗?

解决方案

不。您可能会发现以下链接很有用: 组件对象模型的规则 .

摘抄:

引用计数规则

规则1:必须为接口指针的每份新副本调用AddRef,并要求发布每次破坏接口指针,除非随后的规则明确允许否则。

以下规则召集了规则1的常见不感知。

  • 规则 1a:函数的输入输出参数。调用者必须 AddRef 实际参数,因为当输出值存储在其顶部时,它将被被调用者释放。
  • 规则 1b:获取全局变量。从全局变量中的现有指针副本获取的接口指针的本地副本必须独立进行引用计数,因为被调用的函数可能会破坏全局中的副本,而本地副本仍然存在。
  • 规则 1c:新的指针是用“薄空”合成的。使用特殊内部知识合成接口指针的函数,而不是从其他来源获得它,必须对新合成的指针进行初始addRef。此类例程的重要示例包括实例创建例程、IUnknown::QueryInterface 的实现等。
  • 规则 1d:返回内部存储的指针的副本。返回指针后,被调用者不知道其生命周期与内部存储的指针副本的生命周期有何关系。因此,被调用者必须在返回指针副本之前调用 AddRef。

规则 2:有关起点关系的一段代码的特殊知识以及两个或多个接口指针副本的生命的结局,可以省略AddRef/Release Pairs。

  • 从 COM 客户端的角度来看,引用计数始终是每个接口的概念。客户端永远不应该假设一个对象对所有接口使用相同的引用计数。
  • 不应依赖 AddRef 和 Release 的返回值,并且仅应将其用于调试目的。
  • 指针稳定性;请参阅 OLE 帮助文件中“引用计数规则”下“稳定 this 指针并保持其有效”小节的详细信息。

请参阅道格拉斯·霍奇斯(Douglas Hodges)的出色“管理对象寿命”的技术文章,以及Kraig Brockschmidt(MSDN库,书籍)的Inside Ole,第二版Inside Ole的第3章,有关参考计数的更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top