Condividi tramite


Microsoft RPC Binding-Handle Extensions

Le estensioni Microsoft per il linguaggio IDL supportano più parametri handle visualizzati in posizioni diverse dal primo parametro più a sinistra. I passaggi seguenti descrivono la sequenza che il compilatore MIDL passa per risolvere il parametro di handle di associazione in modalità di compatibilità DCE (/osf) e in modalità predefinita (estesa da Microsoft).

Modalità di compatibilità DCE

  • Handle di associazione visualizzato in prima posizione.
  • Parametro più a sinistra [in, context_handle].
  • Handle di associazione implicito specificato da [implicit_handle] o [auto_handle].
  • Se non è presente alcun ACF, per impostazione predefinita viene utilizzato [auto_handle].

Modalità predefinita

  • Handle di associazione esplicito più a sinistra.
  • Handle di associazione implicito specificato da [implicit_handle] o [auto_handle].
  • Se non è presente alcun ACF, per impostazione predefinita viene utilizzato [auto_handle].

I compilatori IDL DCE cercano un handle di associazione esplicito come primo parametro. Quando il primo parametro non è un handle di associazione e vengono specificati uno o più handle di contesto, l'handle di contesto più a sinistra viene usato come handle di associazione. Quando il primo parametro non è un handle e non sono presenti handle di contesto, la procedura usa l'associazione implicita usando l'attributo ACF [implicit_handle] o [auto_handle].

Le estensioni Microsoft per il linguaggio IDL consentono all'handle di associazione di trovarsi in una posizione diversa dal primo parametro. Il parametro di handle esplicito [in] più a sinistra, indipendentemente dal fatto che si tratti di un handle primitivo, definito dal programmatore o del contesto, è l'handle di associazione. Quando non sono presenti parametri handle, la procedura usa l'associazione implicita usando l'attributo ACF [implicit_handle] o [auto_handle].

Le regole seguenti si applicano sia alla modalità DCE-compatibility (/osf) che alla modalità predefinita:

  • L'associazione di handle automatico viene utilizzata quando non è presente alcun ACF.
  • Handle espliciti [in] o [in, out] per una singola funzione annullano qualsiasi associazione implicita specificata per l'interfaccia.
  • Gli handle primitivi [in] o [in, out] non sono supportati.
  • Sono consentiti più handle di contesto espliciti [in] o [in, out].
  • Tutti i parametri handle definiti dal programmatore, ad eccezione del parametro binding-handle, vengono considerati come dati trasmissibili.

La tabella seguente contiene esempi e descrive il modo in cui gli handle di associazione vengono assegnati in ogni modalità del compilatore.

Esempio Descrizione
void proc1( void );
Non viene specificato alcun handle esplicito. Viene usato l'handle di associazione implicito specificato da [ implicit_handle] o [ auto_handle]. Quando non è presente alcun ACF, viene usato un handle automatico.
void proc2([in] handle_t H,           [in] short s );
Viene specificato un handle esplicito di tipo handle_t. Il parametro H è l'handle di associazione per la procedura.
void proc3([in] short s,           [in] handle_t H );
Il primo parametro non è un handle. In modalità predefinita, il parametro handle più a sinistra, H, è l'handle di associazione. In modalità /osf viene usata l'associazione implicita. Viene segnalato un errore perché si prevede che il secondo parametro sia trasmissibile e handle_t non può essere trasmesso.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
Il primo parametro non è un handle. In modalità predefinita, il parametro handle più a sinistra, H, è l'handle di associazione. Gli stub chiamano le routine fornite dall'utente MY_HDL_bind e MY_HDL_unbind. In/osf mode viene usata l'associazione implicita. Il parametro handle definito dal programmatore H viene considerato come dati trasmissibili.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
Il primo parametro è un handle di associazione. Il parametro H è il parametro binding-handle. Il secondo parametro handle definito dal programmatore viene considerato come dati trasmissibili.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
L'handle di associazione è un handle di contesto. Il parametro H è l'handle di associazione.