Baca dalam bahasa Inggris

Bagikan melalui


Handles

Sebanyak dua bagian dalam deskripsi string format handel alamat prosedur. Bagian pertama adalah handle_type<1> bidang 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 Stub Descriptor untuk masalah handel pengikatan.

Handel Implisit

Jika prosedur menggunakan handel implisit untuk pengikatan, handle_type<1> bidang deskripsi prosedur berisi salah satu dari tiga nilai bukan nol yang valid. Dukungan pengkompilasi 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 handel 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 disediakan untuk rutinitas ikat dan tidak 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 handel konteks hanya [keluar], yang ditangani dengan cara yang sama), informasi handel pengikatan muncul sebagai salah satu parameter prosedur. Tiga deskripsi yang mungkin 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.

Catatan

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 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 penunjuk ke data ukuran yang diberikan.

Bidang binding_routine_pair_index<1> memberikan indeks ke dalam bidang aGenericBindingRoutinePairs dari Deskriptor Stub ke penunjuk fungsi rutin yang mengikat dan tidak mengikat untuk handel generik.

Catatan

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. 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 bawaan –Oi2, param_num<1> menyediakan jumlah ordinal, mulai dari nol, menentukan konteks mana yang menanganinya dalam prosedur yang diberikan.

Untuk versi interpreter sebelumnya, param_num<1> menyediakan nomor parameter handel konteks, mulai dari nol, dalam prosedurnya.

Catatan

Deskripsi handel konteks dalam string format jenis tidak akan memiliki offset<2> dalam deskripsi.

 

Header Baru –Oif

Seperti disebutkan sebelumnya, header –Oif meluas 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<>]

(Ekstensi –Oif )

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 bisa saja telah dikomputasi sebelumnya oleh kompiler. 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 yang dikembalikan.
  • 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 hal ini.