【问题标题】:Is it possible to have an out-of-process COM server where a separate O/S process is used for each object instance?是否可以有一个进程外 COM 服务器,其中每个对象实例使用一个单独的 O/S 进程?
【发布时间】:2011-02-23 06:51:21
【问题描述】:

我有一个遗留的 C++“解决方案引擎”,我已经将它包装为一个进程内 COM 对象,供只需要一个单个“解决方案引擎”的客户端应用程序使用。

但是,我现在有一个需要多个“解决方案引擎”的客户端应用程序。不幸的是,底层遗留代码有足够的全局数据、单例和线程恐怖,给定可用资源,不可能同时在进程中拥有多个实例。

我希望某个善良的灵魂可以告诉我一些 COM 魔法,通过翻转几个注册表设置,可以有一个单独的进程外 COM 服务器(单独的操作系统进程)用于所请求的 COM 对象的每个实例。

我运气好吗?

【问题讨论】:

    标签: c++ com winapi


    【解决方案1】:

    我很确定这是不可能的。 COM 进程外服务器必须全局注册它提供的类对象(通过 CoRegisterClassObject);此注册的一部分是类 GUID。显然,您不能两次注册相同的 GUID。

    【讨论】:

      【解决方案2】:

      您需要一个“主”组件类来锁定 EXE 实例,类似于“应用程序”接口。找到其工厂的 CoRegisterClassObject() 调用。并将 REGCLS 参数更改为 REGCLS_SINGLEUSE。

      一旦第一个客户端连接到类工厂,这将自动取消注册。再次为该工厂调用 CoCreateInstance() 会启动服务器的新实例。我想。

      【讨论】:

        【解决方案3】:

        是的,这是可能的。关键是通过调用CoRegisterClassObject 注册您的coclass,然后在flags 参数中的值REGCLS_SINGLEUSE 中进行或运算。

        如果您的项目是 ATL 7.0+ 项目,您可以通过覆盖负责注册类对象的CAtlExeModuleT::PreMessageLoop() 来做到这一点,因此:

        HRESULT CATLHacksModule::PreMessageLoop(int nShow)
        {
            HRESULT hr = RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
            if (hr == S_OK)
            {
                if (m_bDelayShutdown && !StartMonitor())
                {
                    hr = E_FAIL;
                }
            }
            else
            {
                m_bDelayShutdown = false;
            }
            return hr;
        }
        

        【讨论】:

        • 在我开始实施之前,我只想解决任何歧义。我需要一个解决方案,其中使用多个“mycomobject”实例的单个“client.exe”进程将导致启动“mycomobject.exe”进程的多个实例。
        • @Tom:是的,这正是它的作用。如果您想自己演示(我建议您在将其部署到生产代码之前这样做),请在没有上述代码的情况下制作一个小型 COM 服务器,并针对客户端进行测试。为您的 COM 对象提供一个返回 GetCurrentProcessId 的属性。你会发现如果你CoCreateInstance你的界面5次没有REGCLS_SINGLEUSE它会使用一个进程,但是如果你写上面的代码会有5次。这就是我回答你的问题。
        猜你喜欢
        • 2013-01-26
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多