Freigeben über


Microsoft RPC-Binding-Handle-Erweiterungen

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

DCE-Kompatibilitätsmodus

  • Bindungshandle, das an erster Position angezeigt wird.
  • Leftmost [in, context_handle] Parameter.
  • Implizites Bindungshandle angegeben durch [implicit_handle] oder [auto_handle].
  • Wenn kein ACF vorhanden ist, verwenden Sie standardmäßig [auto_handle].

Standardmodus

  • Explizites Linksbindungshandle.
  • Implizites Bindungshandle angegeben durch [implicit_handle] oder [auto_handle].
  • Wenn kein ACF vorhanden ist, verwenden Sie standardmäßig [auto_handle].

DCE IDL-Compiler suchen nach einem expliziten Bindungshandle als ersten Parameter. Wenn der erste Parameter kein Bindungshandle ist und mindestens ein Kontextziehpunkt angegeben wird, wird das äußerst linke Kontexthandle als Bindungshandle verwendet. Wenn der erste Parameter kein Handle ist und keine Kontexthandles vorhanden sind, verwendet die Prozedur implizite Bindung mithilfe des ACF-Attributs [implicit_handle] oder [auto_handle].

Die Microsoft-Erweiterungen der IDL ermöglichen es, dass sich das Bindungshandle an einer anderen Position als dem ersten Parameter befindet. Der äußerst linke [in] explicit-handle-Parameter – unabhängig davon, ob es sich um einen Grundtyp, ein programmierdefiniertes oder ein Kontexthandle handelt – ist der Bindungshandle. Wenn keine Handle-Parameter vorhanden sind, verwendet die Prozedur implizite Bindung mithilfe des ACF-Attributs [implicit_handle] oder [auto_handle].

Die folgenden Regeln gelten sowohl für den DCE-Compatibility-Modus (/osf) als auch für den Standardmodus:

  • Die Bindung für das automatische Behandeln wird verwendet, wenn kein ACF vorhanden ist.
  • Explizite [in] oder [in, out] Handles für eine einzelne Funktion vor jeder impliziten Bindung, die für die Schnittstelle angegeben ist.
  • Multiple [in] oder [in, out] Primitive Handles werden nicht unterstützt.
  • Mehrere [in] oder [in, out] explizite Kontexthandles sind zulässig.
  • Alle programmierbaren Handleparameter mit Ausnahme des Bindungshandle-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 expliziter Handle angegeben. Das implizite Bindungshandle, das durch [ implicit_handle] oder [ auto_handle] angegeben wird, wird verwendet. Wenn kein ACF vorhanden ist, wird ein automatischer 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 äußerst linke Handle-Parameter Hder Bindungshandle. Im /osf-Modus wird implizite Bindung verwendet. Ein Fehler wird gemeldet, da der zweite Parameter voraussichtlich transmissierbar ist und handle_t nicht übertragen werden können.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
Der erste Parameter ist kein Handle. Im Standardmodus ist der äußerst linke Handle-Parameter Hder 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 programmierdefinierte 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 Bindungshandle-Parameter. Der zweite programmierdefinierte Handle-Parameter 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.