【问题标题】:Single instance of ATL COM classATL COM 类的单个实例
【发布时间】:2011-06-25 00:14:01
【问题描述】:

我有一个 COM 类。它可以被我自己之外的进程访问。每个进程创建它自己的类实例。有没有办法让一个 COM 对象在 CreateInstance() 它的所有进程之间共享?

COM Singleton 是唯一能想到的东西。但是,我没有任何使用此功能的经验。

【问题讨论】:

    标签: c++ visual-studio-2010 com atl


    【解决方案1】:

    我继承的代码库通过在 COM 项目中声明一个静态“实现”实例来实现这一点。

    COM 类只是为该实例提供一个接口。这样,COM 类的多个实例有效地提供了对 COM 服务器内的单例实现对象的访问。

    请注意,这通常需要同步构造。

    【讨论】:

    • CreateInstance(..., CLSCTX_SERVER, ...) 会完成同样的事情吗?基本上实例位于服务器端,客户端只连接到它?
    • 如果它在 DLL 中,则不会失败。 CLSCTX_SERVER 表示存在独立的 EXE 服务器,并且可以作为进程运行。 COM+ 是你的朋友。
    • DECLARE_CLASSFACTORY_SINGLETON 是答案吗?它是否允许单个实例存在于我的 C++ 代码和客户端 JScript 代码之间?
    • @Hans,我的理解是 DECLARE_CLASSFACTORY_SINGLETON 违反了 IClassFactory::CreateInstance() 合同和 COM 的身份规则,并且它不应该包含在 ATL 中。我看到 Don Box 在 TechEd'99 中表达得最好,当时他在数百名观众面前以他标志性的戏剧方式打开了 Program Files 中的 ATL 源文件并立即删除了宏定义。除非 MS 以某种方式修复了它,但我相信这是一个根本问题。或者,除非 Box 错了,这在 COM 中并不经常发生。我不记得所有的细节。
    • 将 DECLARE_CLASSFACTORY_SINGLETON 与此答案中的方法进行对比。使用 DECLARE_CLASSFACTORY_SINGLETON,您的 CreateObject() 将在每次被询问时向 COM 提供相同的 COM 接口指针。它对 COM 撒谎,它需要一个指向新 COM 对象的新指针。相反,在这个解决方案中,有一个单例,但 CreateObject 提供了 new COM 对象,它们为 COM 客户端包装了单例非 COM 对象。这种方法确实尊重 COM 规则。 COM 对象是独立的并且遵循 COM 的生命周期规则;他们都调用共享对象与 COM 无关。
    【解决方案2】:

    进程外服务器中的 COM 单例。如果服务器已经在 DLL 中实现,请考虑使用 COM+ 将其配置为进程外。这样,您将获得两全其美。

    【讨论】:

    • 我确实有一个 EXE,其中定义了我的 COM 对象。将有一些 JScript 实例化对象(或获取它的引用,如果已经存在)并使用它。在我的 EXE 中,相似代码 (C++) 将创建或获取对现有对象的引用。
    猜你喜欢
    • 2012-04-10
    • 2012-07-04
    • 2023-03-03
    • 2010-12-16
    • 2013-06-21
    • 2012-02-28
    • 1970-01-01
    • 2013-10-15
    • 2011-01-12
    相关资源
    最近更新 更多