[英]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.