簡體   English   中英

是否有可能有一個進程外COM服務器,其中每個對象實例使用單獨的操作系統進程?

[英]Is it possible to have an out-of-process COM server where a separate O/S process is used for each object instance?

我有一個傳統的C ++,我已經由僅需要一個單一的 “解決方案引擎”客戶端應用程序包裝成用於一個進程COM對象“溶液引擎”。

但是我現在有一個需要多個“解決方案引擎”的客戶端應用程序。 遺憾的是,底層遺留代碼具有足夠的全局數據,單例和線程恐怖,在給定可用資源的情況下,不可能同時在其中處理多個實例。

我希望是某種善良的靈魂可以告訴我一些COM魔術在哪里通過幾個注冊表設置的翻轉,可以為每個實例提供一個單獨的進程外COM服務器(單獨的操作系統進程)請求的COM對象。

我好運嗎?

是的,這是可能的。 關鍵是通過調用CoRegisterClassObject來注冊您的coclass,並在flags參數中注冊REGCLS_SINGLEUSE

如果您的項目是ATL 7.0+項目,則可以通過重寫CAtlExeModuleT :: PreMessageLoop()來執行此操作, 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;
}

您需要一個“主”coclass來鎖定EXE實例,類似於“應用程序”界面。 找到其工廠的CoRegisterClassObject()調用。 並將REGCLS參數更改為REGCLS_SINGLEUSE。

一旦第一個客戶端連接到它,它將自動取消注冊類工廠。 再次為該工廠調用CoCreateInstance()會啟動服務器的新實例。 我認為。

我很確定這是不可能的。 COM out-of-proc服務器必須全局注冊它提供的類對象(通過CoRegisterClassObject); 此注冊的一部分是GUID類。 顯然你不能兩次注冊相同的GUID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM