一些人指出,存在一个未记录的消息,该消息从文件打开和保存对话框的公共对话框 HWND 中检索 IShellBrowser 接口指针。
但是关于该指针是否是 AddRef'd,或者它是否只是返回的原始地址,存在冲突的信息(或没有信息),并且不应该调用 Release()?
一些人指出,存在一个未记录的消息,该消息从文件打开和保存对话框的公共对话框 HWND 中检索 IShellBrowser 接口指针。
但是关于该指针是否是 AddRef'd,或者它是否只是返回的原始地址,存在冲突的信息(或没有信息),并且不应该调用 Release()?
不,您可能会发现以下链接很有用:组件对象模型的规则。
摘抄:
引用计数规则
规则 1:必须为接口指针的每个新副本调用 AddRef,并且在每次销毁接口指针时调用 Release,除非后续规则明确允许。
以下规则列出了规则 1 的常见非例外情况。
- 规则 1a:函数的输入输出参数。调用者必须 AddRef 实际参数,因为当输出值存储在它上面时,它会被调用者释放。
- 规则 1b:获取全局变量。从全局变量中指针的现有副本中获取的接口指针的本地副本必须独立进行引用计数,因为调用的函数可能会在本地副本仍然存在时破坏全局中的副本。
- 规则 1c:“凭空”合成的新指针。使用特殊内部知识而不是从其他来源获得接口指针的函数必须对新合成的指针执行初始 AddRef。此类例程的重要示例包括实例创建例程、IUnknown::QueryInterface 的实现等。
- 规则 1d:返回内部存储指针的副本。在指针被返回后,被调用者不知道它的生命周期与内部存储的指针副本的生命周期有何关系。因此,被调用者必须在返回指针副本之前调用 AddRef。
规则 2:一段代码对接口指针的两个或多个副本的生命周期的开始和结束的关系的特殊了解可以允许省略 AddRef/Release 对。
- 从 COM 客户端的角度来看,引用计数始终是每个接口的概念。客户不应该假设一个对象对所有接口使用相同的引用计数。
- 不应依赖 AddRef 和 Release 的返回值,而应仅用于调试目的。
- 指针稳定性;请参阅“引用计数规则”下的 OLE 帮助文件中的详细信息,“稳定 this 指针并使其保持有效”小节。
有关引用计数的更多信息,请参阅 Douglas Hodges 撰写的出色的“在 OLE 中管理对象生命周期”技术文章和 Kraig Brockschmidt(MSDN 图书馆,书籍)的 Inside OLE 第 2 版的第 3 章。