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