是否有可能有一个进程外COM服务器,其中每个对象实例使用单独的操作系统进程?

Tom*_*ams 5 c++ com winapi

我有一个传统的C++,我已经由仅需要一个客户端应用程序包装成用于一个进程COM对象"溶液引擎" 单个 "溶液引擎".

但是我现在有一个需要多个"解决方案引擎"的客户端应用程序.遗憾的是,底层遗留代码具有足够的全局数据,单例和线程恐怖,在给定可用资源的情况下,不可能同时在其中处理多个实例.

我希望是某种善良的灵魂可以告诉我一些COM魔术在哪里通过几个注册表设置的翻转,可以为每个实例提供一个单独的进程外COM服务器(单独的操作系统进程)请求的COM对象.

我好运吗?

Joh*_*ing 8

是的,这是可能的.最关键的是通过调用注册您的coclass CoRegisterClassObject,和OR-在价值REGCLS_SINGLEUSEflags参数.

如果您的项目是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)