Bagikan melalui


Menghindari Persembunyian Informasi

Terkadang, program sengaja atau tidak sengaja menyembunyikan informasi dari mesin marshaling RPC. Beberapa contohnya adalah sebagai berikut:

  • Mengirim struktur data sebagai blok byte yang tidak dibenci
  • Memanfaatkan performa dengan menggunakan efek samping dari metode untuk menyalurkan data tambahan di seluruh kawat
  • Mencoba menyamarkan handel dengan meneruskannya sebagai DWORD atau ULONG

Teknik ini hampir dijamin untuk memperkenalkan masalah kompatibilitas bahkan sebelum Anda memindahkan aplikasi Anda ke Windows 64-bit.

Alih-alih mengirim konteks server sebagai DWORD dalam panggilan prosedur jarak jauh standar, gunakan handel konteks untuk memberikan handel buram ke konteks server yang dipegang atas nama klien. Konteks diidentifikasi oleh GUID yang ditentukan oleh run time RPC saat server membuat handel konteks untuk klien. Tidak ada pointer yang digunakan melalui kawat dan operasi benar-benar transparan di seluruh batas 32 atau 64-bit. Untuk informasi selengkapnya tentang menggunakan handel konteks, lihat Handel Konteks.

Antarmuka DCOM tidak dapat menggunakan handel konteks karena COM menyediakan manajemen konteksnya sendiri. Alih-alih membuat handel konteks, Anda dapat meneruskan penunjuk antarmuka ke objek COM. Kemudian Anda dapat memanggil metode langsung melalui penunjuk antarmuka atau menempatkan pointer di dalam panggilan lain. Untuk merilis objek server, klien memanggil metode Rilis antarmuka melalui penunjuk antarmuka.

Sekali lagi, mungkin ada kalanya Anda tidak dapat mengubah desain asli kode yang Anda porting. Jika tidak ada cara untuk menghindari pengiriman pointer di seluruh kawat sebagai DWORD, Anda harus menerapkan beberapa bentuk pemetaan sisi server antara nilai DWORD dan pointer. Salah satu cara untuk melakukan ini adalah dengan mengubah pointer di aplikasi sisi klien menjadi jenis presisi pointer, seperti ULONG_PTR atau DWORD_PTR. Kemudian gunakan atribut MIDL [call_as] untuk meletakkan pointer pada kawat sebagai nilai DWORD . Pembungkus sisi klien hanya perlu meneruskan argumen. Pembungkus sisi server menangani pemetaan di antara kedua jenis. Dengan cara yang sama, Anda dapat menggunakan atribut [transmit_as] atau atribut [represent_as] untuk mengonversi data Anda ke format yang kompatibel dengan mundur untuk representasi kawat.

Jika kompatibilitas mundur-kawat bukan masalah atau jika handel tidak digunakan untuk panggilan jarak jauh dan Anda yakin bahwa panggilan jarak jauh antara proses 32- dan 64-bit tidak akan pernah terjadi, Anda dapat menentukan ulang argumen sebagai ULONG64. Jika perlu, Anda dapat memodifikasi aplikasi 32-bit untuk meneruskan DWORD kepada pengguna. Atau, Anda dapat membangun stub terpisah dari file IDL terpisah untuk setiap platform menggunakan DWORD pada Windows 32-bit dan ULONG64 pada Windows 64-bit.