ID Artikel: 206076 - Kajian Terakhir: 19 September 2011 - Revisi: 2.0

Bagaimana untuk mengumpulkan antarmuka di apartemen di Visual C++

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Catatan Microsoft Visual c ++ 2008, Microsoft Visual C++ 2005, Microsoft Visual C++.NET 2003, dan Microsoft Visual C++.NET 2002 mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan tidak dikelola asli Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk kode Visual C++ unmanaged.
Perbesar semua | Perkecil semua

RINGKASAN

Marshal.exe adalah contoh yang menunjukkan cara yang berbeda marshaling antarmuka di apartemen.

INFORMASI LEBIH LANJUT

Berkas berikut ini tersedia untuk diunduh dari Pusat Unduhan Microsoft:

Perkecil gambar iniPerbesar gambar ini
Unduh
Download paket Marshal.exe sekarang. (http://download.microsoft.com/download/vc60pro/info2/1/WIN98/EN-US/Marshal.exe)

Untuk informasi selengkapnya tentang cara mengunduh berkas dukungan Microsoft, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
119591  (http://support.microsoft.com/kb/119591/ ) Cara mendapatkan berkas dukungan Microsoft dari layanan daring
Microsoft telah memindai berkas ini dari virus. Microsoft menggunakan perangkat lunak pendeteksi virus terbaru yang tersedia pada tanggal saat berkas dikirimkan. Berkas tersebut disimpan di server aman, yang membantu mencegah segala perubahan tidak sah terhadap berkas.

Single-Threaded Apartemen (STA) adalah benang yang diinisialisasi dengan CoInitialize() atau CoInitializeEx (NULL, COINIT_APARTMENTTHREADED). Juga, setiap benang lainnya di proses yang sama yang menggunakan COM juga harus menghubungi CoInitialize() atau CoInitializeEx() untuk menginisialisasi COM untuk thread yang.

Jika Anda membuat objek COM di satu STA Thread, Anda tidak bisa lewat antarmuka pointer ke thread STA lain dan memanggil pada penunjuk itu. Karena panggilan ke objek STA seharusnya serial, COM memberlakukan ini hanya memungkinkan satu benang untuk panggilan ke STA objek ( thread di mana itu diciptakan). Jika penunjuk antarmuka Anda lulus untuk kedua STA thread adalah pointer ke proxy, Anda akan mendapatkan error HRESULT 0x8001010E atau RPC_E_WRONG_THREAD (aplikasi disebut antarmuka yang telah mengerahkan untuk thread berbeda). Jika antarmuka pointer adalah pointer langsung ke objek, COM tidak akan menegakkan serialisasi, Anda tidak akan mendapatkan kesalahan di atas, dan panggilan metode antarmuka akan dibuat. Namun, hal ini masih ilegal perilaku dari klien.

Anda masih dapat memanggil metode STA objek dari benang STA berbeda asalkan Anda melakukannya melalui proxy. Proxy adalah salinan dari antarmuka yang Anda mendapatkan melalui marshaling/unmarshaling. Ketika Anda membuat panggilan melalui proxy, COM membuat Thread switch dan panggilan berakhir mengeksekusi dalam konteks thread di mana STA objek diciptakan.

Ada tiga cara untuk Marsekal/unmarshal sebuah antarmuka untuk thread STA lain:
  1. CoMarshalInterThreadInterfaceInStream() dan CoGetInterfaceAndReleaseStream(): Kelemahan satu untuk menggunakan metode ini adalah antarmuka hanya dapat unmarshaled sekali. Itu adalah, jika Anda memerlukan akses ke objek yang sama dari beberapa STA benang, metode ini tidak akan bekerja.
  2. CoMarshalInterface() dan CoUnMarshalInterface(): Metode ini lebih fleksibel karena Anda dapat mengumpulkan antarmuka sekali dan unmarshal antarmuka sebanyak yang Anda inginkan; sebagai contoh, menetapkan MSHLFLGS_TABLEWEAK atau MSHLFLGS_TABLESTRONG ketika marshaling antarmuka. Tapi itu juga membutuhkan kode lebih karena Anda harus membuat IStream, mengatur penunjuk mencari dan membersihkan paket Marsekal melalui CoReleaseMarshalData(). Ketika marshaling petunjuk untuk proxy Anda harus Windows NT 4.0 Service Pack 4 atau kemudian, Windows 98 atau Windows 95 dengan DCOM 1,2 atau kemudian diinstal. Juga ketika menggunakan MSHLFLGS_TABLESTRONG bendera Anda harus Windows 2000 atau sesudahnya.
  3. Global antarmuka Table(GIT): GIT adalah sebuah objek COM yang memungkinkan Anda untuk menyimpan antarmuka di satu STA benang dan mendapatkan akses ke proxy di thread STA lain. Ini adalah hanya tersedia dengan Windows NT 4.0 Service Pack 3 atau kemudian, Windows 98 atau Windows 95 dengan DCOM 1.1 atau kemudian diinstal.
Marshal.exe berisi TSTMARSH yang merupakan proyek utama. Ini berisi server ATL EXE yang menerapkan ITest. ITest memiliki salah satu metode yang disebut ToUpper(), yang mengubah string untuk huruf besar. Sub-proyek yang disebut klien adalah juga disertakan. Client.CPP adalah di mana semua metode marshaling/unmarshaling ditampilkan. Setiap metode menciptakan contoh tes objek, Marsekal ITest antarmuka dan menciptakan sebuah thread. Dalam setiap benang, antarmuka ITest adalah unmarshaled dan metode ToUpper() dipanggil untuk mengkonversi string. Anda harus melihat output dalam jendela debug: "ini adalah OUTPUT dari benang # N".

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
172314  (http://support.microsoft.com/kb/172314/ ) Penjelasan dari kesalahan RPC_E_WRONG_THREAD

Berlaku bagi:
  • 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
Kata kunci: 
kbsweptvs2008 kbarchitecture kbfile kbhowto kbsample kbthread kbmt KB206076 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:206076  (http://support.microsoft.com/kb/206076/en-us/ )