參數描述項
如先前所述,–Oi 和 –Oif 樣式參數描述項存在。
–Oi 參數描述元
完整解譯的存根需要 RPC 呼叫中每個參數的額外資訊。 程序的參數描述緊接在程式描述之後。
參數描述元
[] 中 [] 或傳回簡單類型參數的描述格式為:
FC_IN_PARAM_BASETYPE
simple_type<1>
–或–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
其中 simple_type<1> 是指出簡單類型的 FC 令牌。 程式代碼如下所示:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
其他 –Oi
參數描述元
所有其他參數類型的描述格式為:
param_direction<1>
stack_size<1>
type_offset<2>
其中每個描述的param_direction<1> 欄位都必須是下表所示的其中一個。
十六進位 | 旗 | 意義 |
---|---|---|
4d | FC_IN_PARAM | 參數中的 。 |
50 | FC_IN_OUT_PARAM | in/out 參數。 |
51 | FC_OUT_PARAM | out 參數。 |
52 | FC_RETURN_PARAM | 程序傳回值。 |
4f | FC_IN_PARAM_NO_FREE_INST | 在 xmit/rep 中做為參數,不會進行釋放。 |
stack_size<1> 是堆疊上的參數大小,以參數在堆棧上佔用的整數數目表示。
注意
64 位平臺上不支援 –Oi 模式。
type_offset<2> 字位是類型格式字串數據表中的位移,表示自變數的類型描述元。
–Oif 參數描述元
參數描述有兩種可能的格式,一種用於基底類型,另一種用於所有其他類型。
基底類型:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
其他:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
在這兩個stack_offset<2> 都表示虛擬自變數堆疊上的位移,以位元組為單位。 針對基底類型,自變數類型會直接由對應至型別的格式字元來指定。 對於其他類型,type_offset<2> 欄位會提供自變數類型描述元所在類型格式字串數據表中的位移。
參數屬性欄位的定義如下:
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 位。
- 如果伺服器必須呼叫參數的 NdrFree* 例程,則會設定 MustFree 位。
- IsSimpleRef 位會針對參考指標的參數設定為其他指標以外的任何參數,而且沒有配置屬性。 對於這類類型,參數描述的type_offset<>字段除了基底型别的参考指针以外,會提供引用型別的位移:直接略過參考指標。
- isDontCallFreeInst 位 會針對不應該呼叫其免費實例例程的特定represent_as參數設定。
- 如果參數為 [out]、[in]、[in、out] 指標或列舉16 的指標,則 serverAllocSize 位為非零,而且會在伺服器解釋器的堆棧上初始化,而不是使用對 I_RpcAllocate的呼叫。 如果非零,這個值會乘以 8,以取得 參數的位元元組數目。 請注意,這樣做表示一律會為指標配置至少 8 個字節。
- IsBasetype 位是針對主要 –Oif 解釋器迴圈封送處理的簡單類型所設定。 特別是,其上具有 range 屬性的簡單型別不會標示為基底類型,以強制使用FC_RANGE標記透過分派進行範圍例程封送處理。
- 不論自變數是否為指標,IsByValue 位是針對傳值所傳送的複合類型設定,但不會針對簡單型別設定。 其設定的複合類型是結構、等位、transmit_as、represent_as、wire_marshal 和 SAFEARRAY。 一般而言,為了在 –Oicf 解釋器中主要解釋器循環的優點引進位,以確保非簡單自變數(稱為複合類型自變數)已正確取值。 這個位在舊版解釋器中從未使用過。