Resolusi Konflik Nama Fungsi/Properti dalam Otomatisasi dalam Ekstensi

Dalam topik ini, "objek" menunjukkan objek, secara keseluruhan, sebagai klien ADSI melihatnya. Artinya, ADSI dan semua ekstensinya.

Nama Fungsi yang Sama Dengan Parameter yang Sama

Jika dua atau beberapa antarmuka IDispatch ganda dalam objek mendukung properti atau metode dengan nama yang sama, misalnya, Func1, pemanggilan ditentukan menggunakan kriteria berikut. Jika klien memiliki penunjuk ke salah satu antarmuka ganda yang mendukung metode yang disebut Func1 dan jika Automation dukungan lingkungan s akses vtable, Func1 dipanggil langsung melalui akses adsi vtable.

Jika salah satu kondisi di atas salah, IDispatch::GetIDsOfNames dan IDispatch::Invoke dipanggil untuk memanggil Func1.

Untuk informasi selengkapnya dan penjelasan singkat tentang bagaimana klien dapat menambahkan penunjuk ke antarmuka ganda, dan deskripsi jenis lingkungan yang mendukung akses yang dapat vtable, lihat Pengikatan Terlambat versus Akses Vtable di Model Ekstensi ADSI.

Karena semua objek ekstensi mengalihkan fungsi IDispatch kembali ke agregator, agregator mengontrol mana Func1 dipanggil. Aturannya adalah:

  • Jika ada antarmuka, dan hanya akan ada satu, jika ada, dalam agregator (ADSI) mendukung fungsi yang disebut Func1, agregator memanggil Func1 sendiri.
  • Jika tidak, agregator melewati setiap ekstensinya, dalam urutan yang tercantum dalam registri, dan menemukan ekstensi pertama yang mengimplementasikan fungsi yang disebut Func1. Dimungkinkan, tetapi tidak mungkin, bahwa beberapa antarmuka IDispatch ganda dalam ekstensi pertama ini memiliki fungsi yang disebut Func1. Ekstensi harus menentukan Func1 mana yang harus selalu dipanggil dalam Automation.

Nama Fungsi yang Sama Dengan Parameter Yang Berbeda

Bagian sebelumnya membahas cara mengatasi konflik nama fungsi, yaitu, nama fungsi yang memiliki nama fungsi yang sama dan daftar parameter yang sama, seperti angka, jenis, dan urutan, ketika terjadi di Automation. Bagaimana jika dua fungsi memiliki nama yang sama tetapi parameter yang berbeda? Jika klien ADSI memanggil fungsi menggunakan IDispatch::GetIDsOfNames tanpa menggunakan beberapa nama untuk menentukan parameter, model ekstensi ADSI tidak dapat membedakan fungsi. Berdasarkan skema resolusi yang dibahas di atas, ekstensi pertama dalam registri yang mendukung fungsi ini melalui salah satu antarmukanya memiliki versi fungsi ini yang dipanggil, dan panggilan mungkin gagal atau menghasilkan hasil yang salah.

Misalnya:

  • Extn1 (pertama dalam registri di bawah CA kelas – prioritas yang lebih tinggi) mendukung IInterface1.
  • Extn2 (ketiga dalam registri di bawah CA kelas – prioritas yang lebih rendah) mendukung IInterface2.
  • IInterface1 mendukung Method1(int param1, int param2).
  • IInterface2 mendukung Method1(int param1).

Klien ADSI memiliki penunjuk antarmuka IDispatch ke objek CA kelas. Ia ingin memanggil IInterface2::Method1. Jika klien memanggil "pDispatch-GetIDsOfNames>(IID_NULL, rgszNames, 1, MY_LCID, rgDispId)" dengan hanya menyimpan nama fungsi "Method1" di rgszNames[0], lalu IInterface1::Method1 alih-alih IInterface2 yang diinginkan ::Method1 dipanggil, dan fungsi gagal karena jumlah parameter berbeda.

Untuk meminimalkan masalah ini, pengembang ekstensi dapat mengawali nama fungsi mereka dengan pengidentifikasi spesifik mereka sendiri dan menghindari desain antarmuka yang menggunakan fungsi dengan nama yang sama, tetapi parameter yang berbeda.

Jika konflik nama terjadi, klien ADSI dapat menghindari masalah dengan akses vtable langsung jika antarmuka adalah antarmuka ganda. Jika akses direct vtable tidak dimungkinkan, klien ADSI harus memanggil IDispatch::GetIDsOfNames dengan beberapa nama, menentukan nama fungsi serta parameter dalam array rgszNames yang dijelaskan sebelumnya.

Visual Basic 5 tidak memanggil fungsi IDispatch::GetIDsOfNames dengan beberapa nama. Artinya, hanya meneruskan nama fungsi ke GetIDsOfNames, tetapi bukan argumen. Namun, Visual Basic 5 memungkinkan pengguna untuk memanggil fungsi dengan akses vtable langsung, alih-alih memanggil fungsi IDispatch::GetIDsOfNames jika antarmuka adalah antarmuka ganda. Pengembang harus menggunakan akses vtable langsung, jika memungkinkan.

Untuk informasi selengkapnya tentang resolusi konflik nama, lihat Contoh untuk Mengatasi Konflik Nama Fungsi.