Bagikan melalui


Membuat Tabel Antarmuka Global

Gunakan panggilan berikut untuk membuat objek tabel antarmuka global dan mendapatkan penunjuk ke IGlobalInterfaceTable:

HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
                 NULL,
                 CLSCTX_INPROC_SERVER,
                 IID_IGlobalInterfaceTable,
                 (void **)&gpGIT);
if (hr != S_OK) {
  exit(0); // Handle errors here.
}

Catatan

Saat membuat objek tabel antarmuka global menggunakan panggilan sebelumnya, perlu ditautkan ke pustaka uuid.lib. Ini akan menyelesaikan simbol eksternal CLSID_StdGlobalInterfaceTable dan IID_IGlobalInterfaceTable.

 

Ada satu instans tabel antarmuka global per proses, sehingga semua panggilan ke fungsi ini dalam proses mengembalikan instans yang sama.

Setelah panggilan ke fungsi CoCreateInstance, daftarkan antarmuka dari apartemen tempatnya berada dengan panggilan ke metode RegisterInterfaceInGlobal. Metode ini menyediakan cookie yang mengidentifikasi antarmuka dan lokasinya. Sebuah apartemen yang mencari pointer ke antarmuka ini kemudian memanggil metode GetInterfaceFromGlobal dengan cookie ini, dan implementasinya kemudian memasok pointer antarmuka ke apartemen panggilan. Untuk mencabut pendaftaran global antarmuka, apartemen apa pun dapat memanggil metode RevokeInterfaceFromGlobal.

Contoh sederhana menggunakan IGlobalInterfaceTable adalah ketika Anda ingin meneruskan penunjuk antarmuka pada objek di apartemen berulir tunggal (STA) ke utas pekerja di apartemen lain. Daripada harus melakukan marsekal ke aliran dan meneruskan aliran ke utas pekerja sebagai parameter utas, IGlobalInterfaceTable memungkinkan Anda hanya meneruskan cookie.

Ketika Anda mendaftarkan antarmuka dalam tabel antarmuka global, Anda mendapatkan cookie yang dapat Anda gunakan alih-alih meneruskan pointer aktual (kapan pun Anda perlu meneruskan pointer), baik ke parameter nonmethod yang akan ke apartemen lain (sebagai parameter ke ThreadProc melalui CreateThread) atau ke memori dalam proses yang dapat diakses di luar apartemen Anda.

Perawatan diperlukan karena menggunakan antarmuka global menempatkan beban ekstra pada programmer mengelola masalah seperti kondisi balapan dan pengecualian bersama, yang terkait dengan mengakses status global dari beberapa utas secara bersamaan.

COM menyediakan implementasi standar antarmuka IGlobalInterfaceTable. Sangat disarankan agar Anda menggunakan implementasi standar ini karena menyediakan fungsionalitas thread-safe lengkap.

Kapan Menggunakan Tabel Antarmuka Global