我有一個進程外com服務器,指定CLSCTX_LOCAL_SERVER作爲上下文,REGCLS_MULTIPLEUSE作爲連接類型。這會導致單個服務器進程被多個客戶端的多個調用重用。進程外COM服務器 - 每個調用進程有一個服務器進程?
我現在想對服務器進行一些更改,但不幸的是無法使用客戶端之間共享的單個進程(這是有原因的,但是他們很長時間)。我知道你可以設置服務器使用REGCLS_SINGLEUSE作爲連接類型,這將爲每次調用OOP服務器創建一個新的進程。這解決了我的問題,但在流程使用方面卻不是首發;短時間內多次調用會導致很多進程,並且這個特定的服務器可能會經常遭遇難以置信的攻擊。
有沒有人碰巧知道混合這兩種連接類型的機制?基本上我想要的是每個調用進程的單個服務器進程。 (即,客戶端創建一個進程,並且該進程被重用於來自該客戶端的後續調用,客戶端2嘗試調用服務器,並創建一個新進程)。我懷疑我可以通過強制REGCLS_SINGLEUSE服務器在客戶端永久保持打開狀態來實現它,但這既不優雅也不可能(因爲我無法更改其中一個客戶端)。
想法?
UPDATE 正如所料,似乎沒有辦法做到這一點。如果時間和資源允許,我很可能會將其轉換爲In-Proc解決方案。但現在,我不得不採用任何呼叫客戶端使用的新行爲。幸運的是,這種變化的影響非常小,並且被客戶所接受。稍後我會研究更激烈和適當的更改。
注意 我已標記漢斯的答案回答,因爲它事實上確實給一個解決的維護OOP解決的問題。我只是沒有能力實施它。
cal
所以你想要一個進程內解決方案的所有好處,而不需要它在進程內。這是對的嗎?因爲你所描述的每一個過程(這個過程中的「過程」)恰恰是這樣做的,只有過程隔離是缺失的成分。 – WhozCraig
到目前爲止(這是遺留代碼),我沒有發現任何暗示,它確實需要過程中,並且我個人可能會使它處於進程中。不幸的是,這種改變的規模並不能證明在改變這種情況時需要進行的測試。就目前而言,我將新行爲抹去了面向對象,並接受它稍微改變了老客戶的行爲。 – cal
@cal,最好的解決方案是Hans提到的Application coclass。 – Ben