文章編號: 206076 - 上次校閱: 2008年5月22日 - 版次: 7.0

如何跨 apartments Visual C++ 中,介面封送處理

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
附註Microsoft Visual C++ 2008年、 Microsoft Visual C++ 2005年、 Microsoft Visual C++.NET 2003 及 Microsoft Visual C++.NET 2002年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
全部展開 | 全部摺疊

結論

Marshal.exe 是範例所示範的封送處理介面 apartments 跨不同的方式。

其他相關資訊

下列檔案是可以從 Microsoft 下載中心 」 下載:

摺疊此圖像展開此圖像
Download
Download the Marshal.exe package now. (http://download.microsoft.com/download/vc60pro/info2/1/win98/en-us/marshal.exe)

如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591? (http://support.microsoft.com/kb/119591/ ) 如何從線上服務取得 Microsoft 的支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,協助防止未經授權的任何變更的檔案。

一個 Single-Threaded 公寓 (STA) 是以 CoInitialize() 或 CoInitializeEx (NULL,COINIT_APARTMENTTHREADED) 已初始化的執行緒。而且,CoInitialize() 或 CoInitializeEx() COM 初始化為它的執行緒,必須也呼叫任何其他的執行緒在相同的處理序中,使用 COM。

如果您在一個 STA 中建立 COM 物件執行緒,您不傳送介面指標到另一個 STA 執行緒和呼叫出該指標上。由於 STA 物件的呼叫都應該要進行序列化,COM 會強制這藉由只允許一個執行緒來呼叫進入 STA 物件 (當初建立的執行緒)。如果您傳遞給第二個 STA 執行緒的介面指標的指標,Proxy 會得到錯誤 HRESULT 0x8001010E 或 RPC_E_WRONG_THREAD (應用程式的不同的執行緒呼叫已封送處理的介面)。如果介面指標,物件的直接指標 COM 不會強制執行序列化、 不會得到上述的錯誤也將進行介面方法呼叫。不過,這是仍然不合法的用戶端的行為。

您可以仍然呼叫方法上 STA 物件從不同的 STA 執行緒,只要您透過 Proxy 執行。Proxy 是透過封送處理/unmarshaling 取得介面的複本。當您可透過 Proxy COM 可呼叫執行緒切換控制和呼叫最後在 STA 物件已建立的執行緒的內容中執行。

有三種方法來封送處理/unmarshal 至另一個 STA 執行緒介面:
  1. CoMarshalInterThreadInterfaceInStream() 和 CoGetInterfaceAndReleaseStream(): 一個使用這個方法的缺點是介面僅能解封送處理一次。也就是如果您從數個 STA 執行緒需要相同的物件的存取,這個方法不會運作。
  2. CoMarshalInterface() 和 CoUnMarshalInterface(): 自封送處理介面一次並 unmarshal 所您次數介面喜歡 ; 比方說指定 MSHLFLGS_TABLEWEAK 或 MSHLFLGS_TABLESTRONG 當封送處理介面時,這個方法是更有彈性。但它也需要更多的程式碼,因為您必須建立 [IStream、 設定搜尋指標,並清除封送處理封包透過 CoReleaseMarshalData()。當封送處理 Proxy 的指標時您必須具備 Windows NT 4.0 服務套件 4 或稍後,Windows 98 或 Windows 95 與 DCOM 1.2,或者稍後再安裝。此外時使用 [MSHLFLGS_TABLESTRONG 旗標必須具有 Windows 2000 或更新版本。
  3. 通用介面 Table(GIT): [GIT 是可讓您在一個 STA 執行緒中儲存介面,並取得存取權它的 Proxy 在另一個 STA 執行緒中的 COM 物件。這只是可以透過 Windows NT 4.0 Service Pack 3 或稍後,Windows 98 或 Windows 95 與 DCOM 1.1 或稍後再安裝。
Marshal.exe 包含 TSTMARSH 也就是主要的專案。這包含實作 ITest 的 ATL EXE 伺服器。ITest 有一個方法呼叫轉換成大寫字串的 ToUpper()。sub-project,稱為用戶端也會包含在內。Client.cpp 是所有封送處理/unmarshaling 的方法所示。每一種方法建立測試物件的執行個體、 元帥一個 ITest 介面,並建立一個執行緒。在每個執行緒中 ITest 介面是解封送處理並方法 ToUpper() 稱為將字串轉換。您應該會看到 [偵錯] 視窗中的輸出: 」 這 IS 輸出從執行緒 # N"。

?考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
172314? (http://support.microsoft.com/kb/172314/ ) RPC_E_WRONG_THREAD 錯誤的說明

這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
關鍵字:?
kbmt kbsweptvs2008 kbarchitecture kbfile kbhowto kbsample kbthread KB206076 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:206076? (http://support.microsoft.com/kb/206076/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。