我很難在outprocess環境中理解COM公寓。在進程環境中,公寓是否在服務器端或客戶端「活着」?
基本上我不明白爲什麼客戶需要撥打CoInitializeEx
在公寓註冊它自己的線程。 我可以理解生活在STA或MTA中的服務器線程和服務器線程所使用的對象。但我不明白爲什麼客戶端應該關注這一點。
每份文件/指南都說客戶必須致電CoInitializeEx
在公寓註冊。這是否意味着服務器保持跟蹤客戶端的線程? 或者公寓數據也分配在客戶端進程中?
我很難在outprocess環境中理解COM公寓。在進程環境中,公寓是否在服務器端或客戶端「活着」?
基本上我不明白爲什麼客戶需要撥打CoInitializeEx
在公寓註冊它自己的線程。 我可以理解生活在STA或MTA中的服務器線程和服務器線程所使用的對象。但我不明白爲什麼客戶端應該關注這一點。
每份文件/指南都說客戶必須致電CoInitializeEx
在公寓註冊。這是否意味着服務器保持跟蹤客戶端的線程? 或者公寓數據也分配在客戶端進程中?
駐留在超程序服務器中的COM對象實際上由兩部分組成 - 服務器中的實現代碼和由編譯器和COM運行時創建的RPC代理/存根代碼。調用遠程COM對象轉換爲對本地代理對象的調用,然後使用一些RPC機制來編組並將調用作爲消息發送到服務器進程。該消息由服務器中的存根挑選,然後調用真正的COM對象,並將結果編組回到代理,然後解組並將其返回給調用客戶端代碼。從客戶端和COM對象的角度來看,所有的調用都是本地的,即使通過網絡發生,就像DCOM一樣。
現在,客戶端中的代理像一個普通的COM對象一樣工作,它必須駐留在某種公寓中。服務器中的COM對象也駐留在它自己的公寓中。 COM允許客戶端和服務器擁有不同的線程模型並處理正確的同步錯誤(當兩個互操作代碼片段駐留在不同的進程中時,這非常容易)。
我建議你閱讀MSDN上的COM指南的Process, Thread, and Apartments部分,以便更好地瞭解哪一個是什麼以及它們是如何相互關聯的。
跟蹤線程不是服務器,它是COM將線程連接到某個公寓。客戶端擁有線程,因此客戶可以選擇創建STA或MTA。
一旦客戶端爲線程選擇了所需的公寓模型,COM將決定如何完全滿足特定的呼叫。如果一個COM類只註冊在MTA中運行,並且客戶端的streda是STA,那麼COM的工作就是負責在工作者MTA線程上創建實際的對象並將其接口編組到客戶端的STA中。
客戶端選擇操作模式,COM與服務器的註冊一起獲取。