2011-10-10 67 views
3

我有一個多線程C++ Builder GUI應用程序,它通過COM與第三方應用程序進行通信。如何訪問來自不同公寓模型的COM對象?

我需要從幾個線程中調用COM對象的方法,並且使用互斥鎖來保護訪問。顯然,主要的GUI線程必須使用STA模型,但我的工作線程需要使用MTA。 COM對象在MTA線程中構造。

一切工作正常,除了由於MTA/STA不匹配,從GUI線程訪問COM對象。

我已經讀了一些關於編組,但還沒有試圖實現它,因爲我看到的例子似乎需要不同的訪問語義,取決於當前的公寓模型,我真的想要代碼(來自程序員的POV)不關心當前的公寓模型。

那麼,有沒有一種習慣寫COM代碼的方式來運行'相同'對象,但可以從STA和MTA線程中調用?

+2

封送接口指針*爲必填*,你不能跳過它。 IGlobalInterfaceTable使其變得容易。 –

+0

@Hans,是的,但是如果我有它的權利,一些線程需要編組指針,其他線程需要unmarshalled指針?我正在尋找一種方法來統一,或根據當前的線程公寓模型動態地切換哪個接口指針......? – Roddy

+6

嗯,只是總是指揮指揮官。如果不需要進行公寓轉換,您只需獲得原件。 –

回答

1

將COM對象接口放入Global Interface Table並讓GIT爲您處理編組。當任何線程請求COM接口時,GIT檢查呼叫公寓並相應地提供直接指針或合適的代理。您的代碼不會知道區別(或關心),只需根據需要正常使用返回的接口即可。

這是記錄在MSDN:

Accessing Interfaces Across Apartments