Bagikan melalui


In-Context Tindakan Pencegahan Fungsi Kait

Untuk alasan performa, pengembang klien mendaftarkan fungsi kait dalam konteks. Namun, karena fungsi kait ini dipetakan ke ruang alamat server, pengembang klien dan server harus mengambil tindakan pencegahan untuk memastikan bahwa pemrosesan peristiwa berjalan dengan lancar.

Tindakan Pencegahan untuk Pengembang Klien

Pengembang klien harus mengetahui masalah berikut:

  • Fungsi kait dalam konteks tidak boleh menggunakan banyak waktu prosesor, karena fungsi kait harus kembali sebelum aplikasi server berlanjut.
  • Setelah peristiwa dipicu, ada kemungkinan bahwa jendela yang terkait dengan peristiwa tidak lagi ada pada saat fungsi kait dipanggil. Klien harus memverifikasi bahwa jendela yang terkait dengan peristiwa masih ada sebelum mengambil tindakan lain yang terkait dengan peristiwa tersebut. Untuk memastikan bahwa jendela masih ada, klien menggunakan fungsi Microsoft Win32 IsWindow .
  • Jika DLL tempat fungsi kait didefinisikan tautan ke DLL lain, pengembang klien harus memastikan bahwa sistem memuat DLL lainnya. Jika menautkan secara implisit (menggunakan file .def dan impor), DLL tambahan harus berada di direktori Windows atau salah satu direktori sistem seperti Windows\System, Windows\System32, atau Windows\SysWOW64. Jika menautkan secara eksplisit (menggunakan LoadLibrary), jalur lengkap ke direktori tempat DLL tambahan berada harus ditentukan dalam panggilan ke LoadLibrary.
  • Fungsi kait dalam konteks dapat menyebabkan luapan tumpukan ketika DLL yang berisi fungsi kait dimuat ke dalam aplikasi 16-bit. Masalah ini terjadi karena aplikasi 16-bit menggunakan ukuran tumpukan tetap yang tidak cukup besar untuk mengakomodasi rantai panggilan fungsi sistem yang menghasilkan panggilan ke fungsi kait.

Tindakan Pencegahan untuk Pengembang Server

Pengembang server perlu menyadari bahwa aplikasi klien mungkin mendaftarkan fungsi kait dalam konteks. Ketika server memanggil NotifyWinEvent, server harus siap untuk menangani WM_GETOBJECT dan metode IAccessible lainnya.

Penunjuk Antarmuka Tidak Valid

Ketika klien memanggil AccessibleObjectFromEvent dalam fungsi kait dalam konteks, penunjuk antarmuka IAccessible yang dikembalikan menunjuk langsung ke kode di ruang alamat server. Jika klien memanggil properti antarmuka menggunakan penunjuk ini, pustaka Model Objek Komponen (COM) tidak terlibat dengan marshaling (pengemasan dan pengiriman parameter antarmuka di seluruh batas proses) atau membatalkan nama (parameter pembukaan paket yang telah dikirim melintasi batas proses) dan tidak mendeteksi apakah objek dihancurkan.

Jika klien memanggil properti antarmuka ke objek yang dihancurkan, penunjuk antarmuka yang tidak valid menyebabkan kesalahan Perlindungan Umum di ruang alamat server kecuali server mendeteksi situasi ini.

Untuk melindungi dari penunjuk antarmuka yang tidak valid, server membuat objek proksi yang membungkus objek yang dapat diakses dan memantau masa pakai objek yang dapat diakses. Misalnya, ketika klien memanggil properti IAccessible untuk mendapatkan informasi tentang objek, proksi memeriksa apakah objek yang dapat diakses masih tersedia, dan jika demikian, meneruskan permintaan klien ke objek yang dapat diakses. Jika objek yang dapat diakses dihancurkan, proksi mengembalikan kesalahan kepada klien.