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

时间:2009-12-15 19:40:45

标签: c++ winapi openfiledialog

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

但是有关于该指针是否为AddRef的信息(或没有信息),或者它是否仅仅是返回的原始地址,并且不应该调用Release()?

1 个答案:

答案 0 :(得分:3)

没有。您可能会发现以下链接很有用:The Rules of the Component Object Model

摘录:

  

参考计数规则

     

规则1:必须调用AddRef   每个接口的新副本   指针和释放呼叫每一个   破坏界面指针,   除非后续规则   明确许可。

     

以下规则引用了共同点   对规则1没有看法。

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

规则2:关于该部分的特殊知识   一段代码   初始与关系的关系   两个或两个生命周期的结束   更多的接口指针副本   可以允许AddRef / Release对   删去。

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

查看优秀的“管理对象”   OLE中的生命周期“技术文章”   Douglas Hodges和第3章   内部OLE,第2版,由Kraig   Brockschmidt(MSDN Library,Books)for   更多信息   引用计数。