代码之家  ›  专栏  ›  技术社区  ›  Mordachai

呼叫方是否需要释放通过未记录的wm_getishellbrowser(wm_user+7)消息获得的ishellbrowser*?

  •  0
  • Mordachai  · 技术社区  · 16 年前

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

    但是,关于指针是addRef'd,还是仅仅返回了原始地址,并且不应该对其调用release(),存在冲突信息(或者没有信息)?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Rob Kennedy    16 年前

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

    Excerpt:

    参考计数规则

    规则1:必须为调用AddRef 接口的每个新副本 指针和释放调用 销毁接口指针, 后续规则除外 否则明确允许。

    以下规则是常见的 规则1的非例外情况。

    • 规则1a:函数的输入输出参数。调用方必须添加实际参数,因为当out值存储在其上时,它将由被调用方释放。
    • 规则1b:获取全局变量。从全局变量中指针的现有副本中提取的接口指针的本地副本必须独立地进行引用计数,因为被调用函数可能会在本地副本仍处于活动状态时破坏全局中的副本。
    • 规则1c:“稀薄空气”合成的新指针。使用特殊内部知识合成接口指针的函数,而不是从其他来源获得它,必须对新合成的指针执行初始addref。这些例程的重要示例包括实例创建例程、iunknown::queryinterface的实现等。
    • 规则1d:返回内部存储指针的副本。指针返回后,被调用方不知道其生存期如何与指针的内部存储副本的生存期相关。因此,被调用方必须在返回指针副本之前调用addref。

    规则2:零件的特殊知识 一段代码的 开始和 两个或两个生命周期的结束 接口指针的更多副本 允许AddRef/Release对 省略。

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

    看到优秀的“管理对象” “OLE”技术文章的生命周期 道格拉斯·霍奇斯,第3章 《内部奥莱》,第二版,克雷格 Brockschmidt(msdn图书馆,书籍) 有关的详细信息 参考计数。