Bagikan melalui


IMarshal::Metode GetUnmarshalClass (objidl.h)

Mengambil CLSID dari kode yang belum dibaca.

Sintaks

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

Parameter

[in] riid

Referensi ke pengidentifikasi antarmuka yang akan dirusak.

[in] pv

Penunjuk ke antarmuka yang akan dijadikan marshal; dapat berupa NULL jika penelepon tidak memiliki penunjuk ke antarmuka yang diinginkan.

[in] dwDestContext

Konteks tujuan di mana antarmuka yang ditentukan akan dilepaskan namanya. Nilai yang mungkin berasal dari MSHCTX enumerasi. Unmarshaling dapat terjadi baik di apartemen lain dari proses saat ini (MSHCTX_INPROC) atau dalam proses lain pada komputer yang sama dengan proses saat ini (MSHCTX_LOCAL).

[in] pvDestContext

Parameter ini dicadangkan dan harus NULL.

[in] mshlflags

Menunjukkan apakah data yang akan di-marshalasi akan ditransmisikan kembali ke proses klien (kasus umum) atau ditulis ke tabel global, di mana data tersebut dapat diambil oleh beberapa klien. Nilai yang mungkin berasal dari enumerasi MSHLFLAGS .

[out] pCid

Pointer yang menerima CLSID yang akan digunakan untuk membuat proksi dalam proses klien.

Nilai kembali

Jika metode berhasil, nilai yang dikembalikan S_OK. Jika tidak, itu S_FALSE.

Keterangan

Metode ini disebut secara tidak langsung, dalam panggilan ke CoMarshalInterface, dengan kode apa pun dalam proses server bertanggung jawab untuk marshaling pointer ke antarmuka pada objek. Kode marshaling ini biasanya merupakan ganja yang dihasilkan oleh COM untuk salah satu dari beberapa antarmuka yang dapat marshal penunjuk ke antarmuka yang diimplementasikan pada objek yang sama sekali berbeda. Contohnya termasuk antarmuka IClassFactory dan IOleItemContainer . Untuk tujuan diskusi, kode yang bertanggung jawab untuk marshaling pointer disebut marshaling stub.

Untuk membuat proksi untuk objek, COM memerlukan dua informasi dari objek asli: jumlah data yang akan ditulis ke aliran marshaling dan CLSID proksi.

Potong marsekal mendapatkan dua informasi ini dengan panggilan berturut-turut ke CoGetMarshalSizeMax dan CoMarshalInterface.

Catatan untuk Penelepon

Stub marshaling memanggil implementasi objek dari metode ini untuk mendapatkan CLSID yang akan digunakan dalam membuat instans proksi. Klien, setelah menerima CLSID, memuat DLL yang tercantum untuk itu di registri sistem.

Anda tidak secara eksplisit memanggil metode ini jika Anda menerapkan antarmuka COM yang ada atau menggunakan Microsoft Interface Definition Language (MIDL) untuk menentukan antarmuka Anda sendiri. Dalam kedua kasus, stub secara otomatis melakukan panggilan. Lihat Menentukan Antarmuka COM.

Jika Anda tidak menggunakan MIDL untuk menentukan antarmuka Anda sendiri, stub Anda harus memanggil metode ini, baik secara langsung atau tidak langsung, untuk mendapatkan CLSID yang diperlukan pustaka COM sisi klien untuk membuat proksi untuk objek yang mengimplementasikan antarmuka.

Jika penelepon memiliki penunjuk ke antarmuka yang akan di-marshal, seharusnya, sebagai masalah efisiensi, gunakan parameter pv untuk meneruskan pointer tersebut. Dengan cara ini, implementasi yang dapat menggunakan penunjuk seperti itu untuk menentukan CLSID yang sesuai untuk proksi tidak harus memanggil QueryInterface dengan sendirinya . Jika penelepon tidak memiliki penunjuk ke antarmuka yang akan di-marshal, penelepon dapat melewati NULL.

Catatan untuk Pelaksana

COM memanggil GetUnmarshalClass untuk mendapatkan CLSID yang akan digunakan untuk membuat proksi dalam proses klien. CLSID yang akan digunakan untuk proksi biasanya bukan objek asli, tetapi yang akan Anda buat (menggunakan alat Guidgen.exe) khusus untuk objek proksi Anda.

Terapkan metode ini untuk setiap objek yang menyediakan marshaling untuk satu atau beberapa antarmukanya. Kode yang bertanggung jawab untuk menghidupkan objek menulis CLSID, bersama dengan data marshaling, ke aliran; COM mengekstrak CLSID dan data dari aliran di sisi penerima.

Jika implementasi proksi Anda hanya terdiri dari menyalin seluruh objek asli ke dalam proses klien, sehingga menghilangkan kebutuhan untuk meneruskan panggilan ke objek asli, CLSID yang dikembalikan akan sama dengan objek asli. Strategi ini, tentu saja, disarankan hanya untuk objek yang tidak diharapkan berubah.

Jika parameter pvADALAH NULL dan implementasi Anda memerlukan penunjuk antarmuka, parameter tersebut dapat memanggil QueryInterface pada objek saat ini untuk mendapatkannya. Parameter pv hanya ada untuk meningkatkan efisiensi.

Untuk memastikan bahwa implementasi GetUnmarshalClass Anda terus berfungsi dengan baik karena konteks tujuan baru didukung di masa mendatang, delegasikan marshaling ke implementasi default COM untuk semua nilai dwDestContext yang tidak ditangani implementasi Anda. Untuk mendelegasikan marshaling ke implementasi default COM, panggil fungsi CoGetStandardMarshal .

Catatan Nilai registri ThreadingModel harus Keduanya untuk server dalam proses yang mengimplementasikan CLSID yang dikembalikan dari metode GetUnmarshalClass . Untuk informasi selengkapnya, lihat InprocServer32.
 

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000 Professional [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows 2000 Server [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header objidl.h

Lihat juga

CoMarshalInterface

IMarshal