Microsoft RPC Binding-Handle延伸模組

IDL 語言的 Microsoft 延伸模組支援多個控制碼參數,這些參數出現在第一個、最左邊、參數以外的位置。 下列步驟說明 MIDL 編譯器在 DCE 相容性模式 (/osf) ,以及在預設 (Microsoft 擴充) 模式中解析系結控制碼參數的順序。

DCE 相容性模式

  • 出現在第一個位置的系結控制碼。
  • 最左邊的 [incoNtext_handle] 參數。
  • 由 [implicit_handle] 或 [auto_handle] 指定的隱含系結控制碼。
  • 如果沒有 ACF 存在,則預設為使用 [auto_handle]。

預設模式

DCE IDL 編譯器會尋找明確的系結控制碼作為第一個參數。 當第一個參數不是系結控制碼,而且指定了一或多個內容控制碼時,最左邊的內容控制碼會當做系結控制碼使用。 當第一個參數不是控制碼且沒有內容控制碼時,程式會使用 ACF 屬性 [implicit_handle] 或 [auto_handle] 的隱含系結。

IDL 的 Microsoft 延伸模組允許系結控制碼位於第一個參數以外的位置。 最左邊的 [in] 明確控制碼參數,無論是基本型別、程式設計人員定義或內容控制碼,都是系結控制碼。 如果沒有控制碼參數,程式會使用 ACF 屬性 [implicit_handle] 或 [auto_handle] 的隱含系結。

下列規則適用于 /osf) 模式和預設模式 (DCE 相容性:

  • 當沒有 ACF 存在時,就會使用自動控制碼系結。
  • 個別函式的明確 [in] 或 [inout] 控制碼會先占介面所指定的任何隱含系結。
  • 不支援多個 [in] 或 [in, out] 基本控制碼。
  • 允許多個 [in] 或 [in, out] 明確內容控制碼。
  • 系結控制碼參數以外的所有程式設計人員定義控制碼參數都會被視為可轉譯的資料。

下表包含範例,並說明如何在每個編譯器模式中指派系結控制碼。

範例 描述
void proc1( void );
未指定明確的控制碼。 使用 [ implicit_handle] 或 [ auto_handle]所指定的隱含系結控制碼。 當沒有任何 ACF 存在時,就會使用自動控制碼。
void proc2([in] handle_t H,           [in] short s );
指定handle_t類型的明確控制碼。 參數 H 是程式的系結控制碼。
void proc3([in] short s,           [in] handle_t H );
第一個參數不是控制碼。 在預設模式中,最左邊的控制碼參數 H是系結控制碼。 在 /osf 模式中,會使用隱含系結。 報告錯誤,因為預期第二個參數是可傳輸的,而且無法傳輸handle_t。
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
第一個參數不是控制碼。 在預設模式中,最左邊的控制碼參數 H是系結控制碼。 存根會呼叫使用者提供的常式MY_HDL_bind和MY_HDL_unbind。 在/osf 模式中,會使用隱含系結。 程式設計人員定義的控制碼參數 H 會被視為可轉譯的資料。
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
第一個參數是系結控制碼。 參數 H 是系結控制碼參數。 第二個程式設計人員定義的控制碼參數會被視為可轉譯的資料。
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
系結控制碼是內容控制碼。 參數 H 是系結控制碼。