是否可以創建COM對象的單個實例,並確保來自任何客戶端的所有後續調用都將僅針對此單實例?需要單例COM對象
回答
請注意,您將不得不使COM對象運行Out-of-process(由EXE公開)。
你真的需要到處使用的COM對象嗎?還是隻想從一個控制點控制相同的底層資源?
COM不直接支持Singleton模式,但它也不會嚴格禁止它。這只是沒有註冊表設置,它說「始終服務於同一個對象」。實際上,標準的COM實例化機制要求每次調用它時都會返回一個真正新的對象(這個機制是new
運算符和CreateInstance()
內部使用的)。這意味着要創建一個合適的COM單例,你不能讓你的客戶自己創建它。這一切都可以完成,但這很棘手,很少需要。
你最好的選擇 - 很有趣 - 根本就沒有COM Singleton。讓客戶創建儘可能多的不同對象。而不是一個COM對象,允許多個COM對象,但使這些對象「墊片」與單一內部對象實現進行通信。不要將內部單例實現直接作爲COM對象公開。你會避免很多頭痛。
對於您的情況,您還有一個額外的問題,即很難保證COM將使用相同的進程來處理對該對象的每個請求。如果你絕對必須保證在任何情況下都不能有多個對象,那麼你必須採取額外的步驟。我認爲在組件服務下注冊你的服務器應該能夠做到這一點,但我已經生鏽了;我將不得不查看它以確保。 – 2012-06-29 20:45:50
這是一個用例,當你的COM服務器有一個客戶端創建新的實例,但不會釋放它們,並定期泄漏內存,並且你不擁有客戶端代碼。 – 2015-11-27 03:02:35
- 1. 我是否需要發佈COM Interop對象的內部對象?
- 2. Python實例到COM對象
- 3. 多實例COM對象
- 4. 需要示例JavaScript對象字面
- 5. Usuageof COM對象上的必需示例成員
- 6. 需要Web表單編輯父子實體對象的示例
- 7. 在VB6中,如何調用需要指向對象的指針的COM對象?
- 8. 我需要爲LDAP COM對象引用哪個DLL?
- 9. 我是否需要使用COM(組件對象模塊)
- 10. 從WMI com對象調用Win32_NetworkAdapterConfiguration例程
- 11. COM對象在C++/CLI中實例化
- 12. 暴露一個COM對象的要求
- 13. Azure COM對象
- 14. OSMDroid簡單示例需要
- 15. C3702 atl com事件需要
- 16. 對象需要在對象C類
- 17. 實現一個簡單的COM對象
- 18. 創建COM對象
- 19. COM對象清理
- 20. 嘲笑COM對象
- 21. COM對象生存
- 22. 使用COM對象
- 23. 發佈COM對象
- 24. 訪問COM對象
- 25. TSQL OLE(com)對象
- 26. COM對象錯誤
- 27. 發佈Com對象
- 28. C++ COM對象Hotpatching?
- 29. COM對象清理
- 30. Javascript與COM對象
它有多獨特?過程中獨一無二的?一個會話中的進程是唯一的嗎?即使在作爲不同用戶運行的進程中也是獨一無二的 – BrendanMcK 2011-06-06 22:09:58
@BrendanMcK,「在同一用戶會話下的所有進程中是唯一的」就足夠了 – user626528 2011-06-07 07:23:42