我有一个传统的C++,我已经由仅需要一个客户端应用程序包装成用于一个进程COM对象"溶液引擎" 单个 "溶液引擎".
但是我现在有一个需要多个"解决方案引擎"的客户端应用程序.遗憾的是,底层遗留代码具有足够的全局数据,单例和线程恐怖,在给定可用资源的情况下,不可能同时在其中处理多个实例.
我希望是某种善良的灵魂可以告诉我一些COM魔术在哪里通过几个注册表设置的翻转,可以为每个实例提供一个单独的进程外COM服务器(单独的操作系统进程)请求的COM对象.
我好运吗?
是的,这是可能的.最关键的是通过调用注册您的coclass CoRegisterClassObject,和OR-在价值REGCLS_SINGLEUSE的flags
参数.
如果您的项目是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;
}
Run Code Online (Sandbox Code Playgroud)