Menangani
Sebanyak dua bagian dalam deskripsi string format handel alamat prosedur. Bagian pertama adalah bidang handle_type<1> deskripsi prosedur, yang digunakan untuk menunjukkan handel implisit. Bagian ini selalu ada. Bagian kedua adalah deskripsi parameter dari setiap handel eksplisit dalam prosedur. Keduanya dijelaskan di bagian berikut, bersama dengan diskusi tentang dukungan pengkompilasi MIDL tambahan dari struktur Deskriptor Stub untuk masalah penanganan pengikatan.
Handel Implisit
Jika prosedur menggunakan handel implisit untuk pengikatan, bidang handle_type<1> deskripsi prosedur berisi salah satu dari tiga nilai bukan nol yang valid. Dukungan kompilator MIDL untuk handel implisit ditemukan di bidang IMPLICIT_HANDLE_INFO struktur Deskriptor Stub:
typedef (__RPC_FAR * GENERIC_BINDING_ROUTINE)();
typedef struct
{
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_ROUTINE_PAIR;
typedef struct __GENERIC_BINDING_INFO
{
void __RPC_FAR* pObj;
unsigned char Size;
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO;
union
{
handle_t* pAutoHandle;
handle_t* pPrimitiveHandle;
PGENERIC_BINDING_INFO pGenericBindingInfo;
} IMPLICIT_HANDLE_INFO;
Jika prosedur menggunakan handel otomatis, anggota pAutoHandle berisi alamat variabel stub defined–auto handle.
Jika prosedur menggunakan handel primitif implisit, anggota pPrimitiveHandle berisi alamat variabel handle stub yang ditentukan-primitif.
Terakhir, jika prosedur menggunakan handel generik implisit, anggota pGenericBindingInfo memegang alamat pointer ke struktur GENERIC_BINDING_INFO yang sesuai. Struktur data MIDL_STUB_DESC berisi penunjuk ke kumpulan struktur GENERIC_BINDING_PAIR. Entri dalam posisi nol koleksi ini dicadangkan untuk ikatan dan rutinitas ikatan yang sesuai dengan handel pengikatan generik yang dirujuk oleh pGenericBindingInfo di IMPLICIT_HANDLE_INFO. Jenis handel pengikatan implisit ditunjukkan dalam string format.
Handel Eksplisit
Ada tiga kemungkinan jenis handel eksplisit: konteks, generik, dan primitif. Dalam kasus handel eksplisit (atau [keluar] hanya handel konteks, yang ditangani dengan cara yang sama), informasi handel pengikatan muncul sebagai salah satu parameter prosedur. Tiga kemungkinan deskripsi adalah sebagai berikut.
Primitif
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
Bendera<1> menunjukkan apakah handel diteruskan oleh penunjuk.
Offset<2> menyediakan offset dari awal tumpukan ke handel primitif.
Nota
Deskripsi handel primitif dalam string format jenis dikurangi menjadi satu FC_IGNORE.
Generik
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
flag_and _size<1> memiliki nibble bendera atas dan nibble ukuran yang lebih rendah. Bendera menunjukkan apakah handel diteruskan oleh penunjuk. Bidang ukuran menyediakan ukuran jenis handel yang ditentukan pengguna-generik. Ukuran ini dibatasi hingga 1, 2 atau 4 byte pada sistem 32-bit dan 1, 2, 4 atau 8 byte pada sistem 64-bit.
Bidang offset<2> menyediakan offset dari awal tumpukan pointer ke data ukuran yang diberikan.
Bidang binding_routine_pair_index<1> memberikan indeks ke dalam bidang aGenericBindingRoutinePairs dari Deskriptor Stub ke pengikatan dan unbind penunjuk fungsi rutin untuk handel generik.
Nota
Deskripsi handel generik dalam format jenis adalah deskripsi jenis data terkait saja.
Konteks
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
Bendera<1> menunjukkan bagaimana handel diteruskan dan jenisnya apa. Bendera yang valid diperlihatkan dalam tabel berikut.
Hex | Bendera |
---|---|
80 | HANDLE_PARAM_IS_VIA_PTR |
40 | HANDLE_PARAM_IS_IN |
20 | HANDLE_PARAM_IS_OUT |
21 | HANDLE_PARAM_IS_RETURN |
08 | NDR_STRICT_CONTEXT_HANDLE |
04 | NDR_CONTEXT_HANDLE_NO_SERIALIZE |
02 | NDR_CONTEXT_HANDLE_SERIALIZE |
01 | NDR_CONTEXT_HANDLE_CANNOT_BE_NULL |
Empat bendera pertama selalu ada, empat bendera terakhir ditambahkan di Windows 2000.
Bidang offset<2> menyediakan offset dari awal tumpukan ke handel konteks.
context_rundown_routine_index<1> menyediakan indeks ke dalam bidang apfnNdrRundownRoutines dari Deskriptor Stub ke rutinitas rundown yang digunakan untuk handel konteks ini. Pengkompilasi selalu menghasilkan indeks. Untuk rutinitas yang tidak memiliki rutinitas rundown, ini adalah indeks ke posisi tabel yang menahan null.
Untuk stub yang dibangun di –Oi2, param_num<1> menyediakan jumlah ordinal, mulai dari nol, menentukan konteks mana yang menanganinya dalam prosedur tertentu.
Untuk versi interpreter sebelumnya, param_num<1> menyediakan nomor parameter handel konteks, mulai dari nol, dalam prosedurnya.
Nota
Deskripsi handel konteks dalam string format jenis tidak akan memiliki offset<2> dalam deskripsi.
Header Baru –Oif
Seperti disebutkan sebelumnya, header –Oif diperluas pada header –Oi. Untuk kenyamanan, semua bidang ditampilkan di sini:
(Header lama)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
constant_client_buffer_size<2> menyediakan ukuran buffer marshaling yang mungkin telah dikomputasi sebelumnya oleh kompilator. Ini mungkin hanya ukuran parsial, karena bendera ClientMustSize memicu ukuran.
constant_server_buffer_size<2> menyediakan ukuran buffer marshaling seperti yang telah dikompilasi oleh kompilator. Ini mungkin hanya ukuran parsial, karena bendera ServerMustSize memicu ukuran.
INTERPRETER_OPT_FLAGS didefinisikan dalam Ndrtypes.h:
typedef struct
{
unsigned char ServerMustSize : 1; // 0x01
unsigned char ClientMustSize : 1; // 0x02
unsigned char HasReturn : 1; // 0x04
unsigned char HasPipes : 1; // 0x08
unsigned char Unused : 1;
unsigned char HasAsyncUuid : 1; // 0x20
unsigned char HasExtensions : 1; // 0x40
unsigned char HasAsyncHandle : 1; // 0x80
} INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS;
- Bit ServerMustSize diatur jika server perlu melakukan pass ukuran buffer.
- Bit ClientMustSize diatur jika klien perlu melakukan pass ukuran buffer.
- Bit HasReturn diatur jika prosedur memiliki nilai pengembalian.
- Bit HasPipes diatur jika paket pipa perlu digunakan untuk mendukung argumen pipa.
- Bit HasAsyncUuid diatur jika prosedurnya adalah prosedur DCOM asinkron.
- Bit HasExtensions menunjukkan bahwa ekstensi Windows 2000 dan yang lebih baru digunakan.
- Bit HasAsyncHandle menunjukkan prosedur RPC asinkron.
Bit HasAsyncHandle awalnya digunakan untuk implementasi DCOM yang berbeda dari dukungan asinkron, dan karenanya tidak dapat digunakan untuk dukungan asinkron gaya saat ini di DCOM. Bit HasAsyncUuid saat ini menunjukkan ini.