Deskriptor Parameter
Seperti disebutkan sebelumnya, – Oi dan deskriptor parameter gaya –Oif ada.
Deskriptor Parameter –Oi
Stub yang ditafsirkan sepenuhnya memerlukan informasi tambahan untuk setiap parameter dalam panggilan RPC. Deskripsi parameter prosedur mengikuti segera setelah deskripsi prosedur.
Simple – Oi
Deskriptor Parameter
Format untuk deskripsi [dalam] atau mengembalikan parameter jenis sederhana adalah:
FC_IN_PARAM_BASETYPE
simple_type<1>
–atau–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Di mana simple_type<1> adalah token FC yang menunjukkan jenis sederhana. Kodenya adalah sebagai berikut:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
-Oi Lainnya
Deskriptor Parameter
Format untuk deskripsi untuk semua jenis parameter lainnya adalah:
param_direction<1>
stack_size<1>
type_offset<2>
Di mana bidang param_direction<1> untuk setiap deskripsi ini harus salah satu yang diperlihatkan dalam tabel berikut.
Hex | Bendera | Arti |
---|---|---|
4d | FC_IN_PARAM | Dalam parameter. |
50 | FC_IN_OUT_PARAM | Parameter masuk/keluar. |
51 | FC_OUT_PARAM | Parameter keluar. |
52 | FC_RETURN_PARAM | Prosedur mengembalikan nilai. |
4f | FC_IN_PARAM_NO_FREE_INST | Dalam xmit/rep sebagai parameter yang tidak dibuat bebas. |
stack_size<1> adalah ukuran parameter pada tumpukan, yang dinyatakan sebagai jumlah bilangan bulat yang ditempati parameter pada tumpukan.
Bidang type_offset<2> adalah offset dalam tabel string format jenis, menunjukkan deskriptor jenis untuk argumen.
Deskriptor Parameter –Oif
Ada dua format yang mungkin untuk deskripsi parameter, satu untuk jenis dasar, yang lain untuk semua jenis lainnya.
Jenis dasar:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Lain:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
Dalam> stack_offset<2 menunjukkan offset pada tumpukan argumen virtual, dalam byte. Untuk jenis dasar, jenis argumen diberikan langsung oleh karakter format yang sesuai dengan jenis. Untuk jenis lain, bidang type_offset<2> memberikan offset dalam tabel string format jenis tempat deskriptor jenis untuk argumen berada.
Bidang atribut parameter didefinisikan sebagai berikut:
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- MustSize bit diatur hanya jika parameter harus berukuran.
- Bit MustFree diatur jika server harus memanggil rutinitas NdrFree* parameter.
- Bit IsSimpleRef diatur untuk parameter yang merupakan penunjuk referensi ke apa pun selain pointer lain, dan yang tidak memiliki atribut alokasi. Untuk jenis seperti itu, bidang type_offset<> deskripsi parameter, kecuali untuk penunjuk referensi ke jenis dasar, menyediakan offset ke jenis referensi; penunjuk referensi hanya dilewati.
- Bit IsDontCallFreeInst diatur untuk parameter represent_as tertentu yang rutinitas instans gratisnya tidak boleh dipanggil.
- Bit ServerAllocSize bukan nol jika parameternya adalah [keluar], [di], atau [masuk,] pointer ke pointer, atau pointer ke enum16, dan akan diinisialisasi pada tumpukan interpreter server, daripada menggunakan panggilan ke I_RpcAllocate. Jika bukan nol, nilai ini dikalikan dengan 8 untuk mendapatkan jumlah byte untuk parameter . Perhatikan bahwa melakukannya berarti setidaknya 8 byte selalu dialokasikan untuk pointer.
- Bit IsBasetype diatur untuk jenis sederhana yang sedang dinaungi oleh perulangan penerjemah -Oif utama. Secara khusus, jenis sederhana dengan atribut rentang di atasnya tidak ditandai sebagai jenis dasar untuk memaksa rentang marshaling rutin melalui pengiriman menggunakan token FC_RANGE.
- Bit IsByValue diatur untuk jenis gabungan yang dikirim oleh nilai, tetapi tidak diatur untuk jenis sederhana, terlepas dari apakah argumen adalah penunjuk. Jenis senyawa yang ditetapkan adalah struktur, serikat, transmit_as, represent_as, wire_marshal dan SAFEARRAY. Secara umum, bit diperkenalkan untuk keuntungan perulangan penerjemah utama dalam penerjemah-Oicf, untuk memastikan argumen nonsimple (disebut sebagai argumen jenis majemuk) didereferensikan dengan benar. Bit ini tidak pernah digunakan dalam versi penerjemah sebelumnya.