Microsoft RPC-Binding-Handle-Erweiterungen

Die Microsoft-Erweiterungen für die IDL-Sprache unterstützen mehrere Handle-Parameter, die an anderen Positionen als dem ersten, äußerst linken Parameter angezeigt werden. In den folgenden Schritten wird die Sequenz beschrieben, die der MIDL-Compiler durchläuft, um den Bindungshandleparameter im DCE-Kompatibilitätsmodus (/osf) und im Standardmodus (Microsoft-erweitert) aufzulösen.

DCE-Kompatibilitätsmodus

  • Bindungshandle, das an der ersten Position angezeigt wird.
  • Ganz links [in, context_handle]-Parameter.
  • Implizites Bindungshandle, angegeben durch [implicit_handle] oder [auto_handle].
  • Wenn kein ACF vorhanden ist, wird standardmäßig [auto_handle] verwendet.

Standardmodus

  • Explizites Bindungshandle links.
  • Implizites Bindungshandle, angegeben durch [implicit_handle] oder [auto_handle].
  • Wenn kein ACF vorhanden ist, wird standardmäßig [auto_handle] verwendet.

DCE-IDL-Compiler suchen nach einem expliziten Bindungshandle als ersten Parameter. Wenn der erste Parameter kein Bindungshandle ist und ein oder mehrere Kontexthandles angegeben sind, wird das Kontexthandle ganz links als Bindungshandle verwendet. Wenn der erste Parameter kein Handle ist und keine Kontexthandles vorhanden sind, verwendet die Prozedur implizite Bindung mit dem ACF-Attribut [implicit_handle] oder [auto_handle].

Die Microsoft-Erweiterungen für die IDL ermöglichen, dass sich das Bindungshandle an einer anderen Position als dem ersten Parameter befindet. Der explizitste [in]-Parameter auf der linken Seite – unabhängig davon, ob es sich um ein primitives, programmiererdefiniertes oder Kontexthandle handelt – ist das Bindungshandle. Wenn keine Handle-Parameter vorhanden sind, verwendet die Prozedur implizite Bindung mit dem ACF-Attribut [implicit_handle] oder [auto_handle].

Die folgenden Regeln gelten sowohl für den DCE-Kompatibilitätsmodus (/osf) als auch für den Standardmodus:

  • Automatische Handle-Bindung wird verwendet, wenn kein ACF vorhanden ist.
  • Explizite [in] oder [in, out]-Handles für eine einzelne Funktion entfernen jegliche implizite Bindung, die für die Schnittstelle angegeben ist.
  • Mehrere [in] oder [in, out] primitive Handles werden nicht unterstützt.
  • Mehrere explizite Kontexthandles [in] oder [in, out] sind zulässig.
  • Alle vom Programmierer definierten Handle-Parameter mit Ausnahme des Bindungshandles-Parameters werden als übertragbare Daten behandelt.

Die folgende Tabelle enthält Beispiele und beschreibt, wie Bindungshandles in jedem Compilermodus zugewiesen werden.

Beispiel Beschreibung
void proc1( void );
Es wird kein explizites Handle angegeben. Das implizite Bindungshandle, angegeben durch [ implicit_handle] oder [ auto_handle], wird verwendet. Wenn kein ACF vorhanden ist, wird ein automatisches Handle verwendet.
void proc2([in] handle_t H,           [in] short s );
Es wird ein explizites Handle vom Typ handle_t angegeben. Der Parameter H ist das Bindungshandle für die Prozedur.
void proc3([in] short s,           [in] handle_t H );
Der erste Parameter ist kein Handle. Im Standardmodus ist der handle-Parameter auf der linken Seite, H, das Bindungshandle. Im /osf-Modus wird die implizite Bindung verwendet. Es wird ein Fehler gemeldet, da erwartet wird, dass der zweite Parameter übertragbar ist und handle_t nicht übertragen werden kann.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
Der erste Parameter ist kein Handle. Im Standardmodus ist der handle-Parameter auf der linken Seite, H, das Bindungshandle. Die Stubs rufen die vom Benutzer bereitgestellten Routinen MY_HDL_bind und MY_HDL_unbind auf. Im/osf-Modus wird implizite Bindung verwendet. Der vom Programmierer definierte Handleparameter H wird als übertragbare Daten behandelt.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
Der erste Parameter ist ein Bindungshandle. Der Parameter H ist der Bindungshandleparameter. Der zweite vom Programmierer definierte Handleparameter wird als übertragbare Daten behandelt.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
Das Bindungshandle ist ein Kontexthandle. Der Parameter H ist das Bindungshandle.