Bagikan melalui


Kapan Menggunakan Tabel Antarmuka Global

Jika Anda membatalkan nama penunjuk antarmuka beberapa kali di antara apartemen dalam proses, Anda dapat menggunakan antarmuka IGlobalInterfaceTable. Dengan teknik lain, Anda harus meremarshal setiap kali.

Catatan

Jika penunjuk antarmuka tidak diubah hanya sekali, Anda mungkin ingin menggunakan fungsi CoMarshalInterThreadInterfaceInStream. Ini juga dapat digunakan untuk meneruskan penunjuk antarmuka dari satu utas ke utas lain dalam proses yang sama.

 

Antarmuka IGlobalInterfaceTable juga membuat masalah lain yang sebelumnya sulit lebih sederhana untuk programmer. Masalah ini terjadi ketika kondisi berikut berlaku:

  • Objek agile dalam proses mengagregasi marshaler berulir bebas.
  • Objek agile yang sama ini juga menyimpan penunjuk antarmuka (sebagai variabel anggota) ke objek lain yang tidak tangkas dan tidak mengagregasi marshaler utas bebas.

Dalam situasi ini, jika objek luar dirusak ke apartemen lain dan aplikasi memanggilnya, dan objek mencoba memanggil penunjuk antarmuka variabel anggotanya yang tidak berulir bebas atau proksi ke objek di apartemen lain, mungkin mendapatkan hasil yang salah atau kesalahan RPC_E_WRONG_THREAD. Kesalahan ini terjadi karena antarmuka dalam dirancang untuk dapat dipanggil hanya dari apartemen tempat pertama kali disimpan dalam variabel anggota.

Untuk mengatasi masalah ini, objek luar yang mengagregasi marshaler utas bebas harus memanggil IGlobalInterfaceTable::RegisterInterfaceInGlobal pada antarmuka dalam dan menyimpan cookie yang dihasilkan dalam variabel anggotanya, alih-alih menyimpan penunjuk antarmuka yang sebenarnya. Ketika objek luar ingin memanggil penunjuk antarmuka objek dalam, objek tersebut harus memanggil IGlobalInterfaceTable::GetInterfaceFromGlobal, gunakan penunjuk antarmuka yang dikembalikan, lalu melepaskannya. Ketika objek luar hilang, objek harus memanggil IGlobalInterfaceTable::RevokeInterfaceFromGlobal untuk menghapus antarmuka dari tabel antarmuka global.

Membuat Tabel Antarmuka Global