共用方式為


參數描述項

如先前所述,–Oi–Oif 樣式參數描述項存在。

–Oi 參數描述元

完整解譯的存根需要 RPC 呼叫中每個參數的額外資訊。 程序的參數描述緊接在程式描述之後。

Simple –Oi

參數描述元

[] 中 [] 或傳回簡單類型參數的描述格式為:

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_asrepresent_aswire_marshal 和 SAFEARRAY。 一般而言,為了在 –Oicf 解釋器中主要解釋器循環的優點引進位,以確保非簡單自變數(稱為複合類型自變數)已正確取值。 這個位在舊版解釋器中從未使用過。