2011-06-06 113 views
5

是否可以創建COM對象的單個實例,並確保來自任何客戶端的所有後續調用都將僅針對此單實例?需要單例COM對象

+1

它有多獨特?過程中獨一無二的?一個會話中的進程是唯一的嗎?即使在作爲不同用戶運行的進程中也是獨一無二的 – BrendanMcK 2011-06-06 22:09:58

+0

@BrendanMcK,「在同一用戶會話下的所有進程中是唯一的」就足夠了 – user626528 2011-06-07 07:23:42

回答

8

請注意,您將不得不使COM對象運行Out-of-process(由EXE公開)。

你真的需要到處使用的COM對象嗎?還是隻想從一個控制點控制相同的底層資源?

COM不直接支持Singleton模式,但它也不會嚴格禁止它。這只是沒有註冊表設置,它說「始終服務於同一個對象」。實際上,標準的COM實例化機制要求每次調用它時都會返回一個真正新的對象(這個機制是new運算符和CreateInstance()內部使用的)。這意味着要創建一個合適的COM單例,你不能讓你的客戶自己創建它。這一切都可以完成,但這很棘手,很少需要。

你最好的選擇 - 很有趣 - 根本就沒有COM Singleton。讓客戶創建儘可能多的不同對象。而不是一個COM對象,允許多個COM對象,但使這些對象「墊片」與單一內部對象實現進行通信。不要將內部單例實現直接作爲COM對象公開。你會避免很多頭痛。

+1

對於您的情況,您還有一個額外的問題,即很難保證COM將使用相同的進程來處理對該對象的每個請求。如果你絕對必須保證在任何情況下都不能有多個對象,那麼你必須採取額外的步驟。我認爲在組件服務下注冊你的服務器應該能夠做到這一點,但我已經生鏽了;我將不得不查看它以確保。 – 2012-06-29 20:45:50

+0

這是一個用例,當你的COM服務器有一個客戶端創建新的實例,但不會釋放它們,並定期泄漏內存,並且你不擁有客戶端代碼。 – 2015-11-27 03:02:35