2012-08-05 85 views
0

我正在處理一個單線程庫(不是線程安全的),我想將它封裝在一個COM進程外對象中以避開線程非安全問題。我需要一個行爲,其中每個新的COM對象都在其自己的進程中實例化 - 某種形式的進程外單例。進程外COM單例

這是一段時間,因爲我一直在處理硬核COM,所以我不知道如何處理這個問題,或者這是否可能沒有一些欺騙。

回答

4

調用CoRegisterClassObject()並將REGCLS參數設置爲REGCLS_SINGLEUSE。小心成本,一個過程是而不是一個便宜的操作系統對象。

除此之外沒有理由不能確保編組方法調用是線程安全的,只需調用CoInitializeEx()來請求STA。在進程外服務器中也可以像在進程內服務器中一樣運行。如果你只是這樣做來解決線程問題,那麼肯定會支持進程內STA。需要消息循環。

+0

謝謝!我知道進程是昂貴的,但這是唯一的方式去與這個線程不安全的庫。我瞭解STA的要求,但是請您介紹一下多個CoCreateInstance()是否會將封送的poiners返回給多個進程中的對象?每次電話會產生一個新的程序嗎? – wpfwannabe 2012-08-05 17:35:41

+0

是的,REGCLS_SINGLEUSE強制創建一個新的進程。避免假設線程不安全的庫有什麼特別之處,實際上所有非平凡的庫都是線程不安全的。這就是爲什麼STA首先存在。 S和T表示單線程。 – 2012-08-05 17:39:46

相關問題