是否可能有一个进程外COM服务器,其中每个对象实例使用单独的O/S进程? 我有一个遗留的C++“解决方案引擎”,我已经将它封装成一个进程内COM对象,供只需要一个“解决方案引擎”的客户端应用程序使用。

是否可能有一个进程外COM服务器,其中每个对象实例使用单独的O/S进程? 我有一个遗留的C++“解决方案引擎”,我已经将它封装成一个进程内COM对象,供只需要一个“解决方案引擎”的客户端应用程序使用。,c++,com,winapi,C++,Com,Winapi,然而,我现在有一个需要多个“解决方案引擎”的客户端应用程序。不幸的是,底层遗留代码有足够的全局数据、单例和线程恐惧,在给定可用资源的情况下,不可能同时拥有多个实例 我所希望的是,一些善良的灵魂可以告诉我一些COM魔法,通过翻转几个注册表设置,可以为请求的COM对象的每个实例拥有一个单独的进程外COM服务器(单独的操作系统进程) 我运气好吗?我很确定这是不可能的。COM out-proc服务器必须全局注册它提供的类对象(通过CoreRegisterClassObject);此注册的一部分是类GUI

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

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


我运气好吗?

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

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


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

是的,这是可能的。关键是通过调用和或在
flags
参数的值中注册coclass

如果您的项目是ATL 7.0+项目,您可以通过覆盖来完成,覆盖负责注册类对象,因此:

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\u SINGLEUSE
它将使用一个进程,但是如果你写上面的代码,将有5次。我就是这样回答你的问题的。