簡體   English   中英

進程外COM服務器-每個調用進程一個服務器進程?

[英]Out of Process COM Server - One server process per calling process?

我有一個進程外的com服務器,將CLSCTX_LOCAL_SERVER指定為上下文,並將REGCLS_MULTIPLEUSE指定為連接類型。 這導致單個服務器進程被來自多個客戶端的多個調用重用。

我現在想對服務器進行一些更改,不幸的是,這些更改無法與客戶端之間共享的單個進程一起使用(這是有原因的,但長期以來一直存在)。 我知道您可以將服務器設置為使用REGCLS_SINGLEUSE作為連接類型,這將為OOP服務器的每個調用創建一個新進程。 這解決了我的問題,但是對於流程使用而言卻是一個入門者。 短時間內的多次呼叫會導致許多進程,並且可能經常難以置信地擊中該特定服務器。

有人碰巧知道混合這兩種連接類型的機制嗎? 本質上我想要的是每個調用進程一個服務器進程。 (即,客戶端一個創建了一個進程,該進程被重用於該客戶端的后續調用。客戶端兩個嘗試調用服務器,並創建了一個新進程)。 我懷疑我可以通過強制REGCLS_SINGLEUSE服務器在客戶端中永久保持打開狀態來實現此目的,但這既不優雅也不可行(因為我無法更改其中一個客戶端)。

有什么想法嗎?

更新正如預期的那樣,似乎沒有辦法做到這一點。 如果時間和資源允許,我極有可能將其轉換為In-Proc解決方案。 但就目前而言,我必須繼續將新行為用於任何調用客戶端。 幸運的是,此更改的影響非常小,客戶可以接受。 稍后,我將研究更劇烈和適當的更改。

注意我已將Hans的答復標記為答案,因為實際上確實可以解決維護OOP解決方案的問題。 我只是沒有能力執行它。

COM不支持此激活方案。 它應該由進程內服務器覆蓋,請確保鑒於其相當大的優勢,這不是您要執行的操作。

使用REGCLS_SINGLEUSE是替代方法,但是這需要您擴展對象模型,以避免當前創建的服務器實例的風暴。 Application類是樣板方法。 為它提供工廠方法,該方法為您提供現有接口的實例。

我將提到一種完全不同的方法,當我也想解決相同的問題時,我使用了一種方法,但是它需要一個進程外服務器來利用縮小位差的優勢。 您不必擔心COM為您啟動服務器進程,客戶端也可以啟動它。 當然,前提是它足夠了解服務器的安裝位置。 現在,客戶端當然可以完全控制服務器實例了。 帶有更改的CLSID的名為CoRegisterClassObject()的服務器,將GUID的一部分與進程ID進行了異或。 客戶端執行相同的操作,因此它始終與正確的服務器連接。 客戶端需要額外的代碼以確保其等待足夠長的時間,以使服務器有機會注冊其對象工廠。 運作良好。

暫無
暫無

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

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