Dela via


Hanterar

Så många som två delar i formatsträngens beskrivning av en proceduradress hanterar. Den första delen är fältet handle_type<1> i en procedurs beskrivning, som används för att ange implicita referenser. Den här delen är alltid närvarande. Den andra delen är en parameterbeskrivning av en explicit handtag i proceduren. Båda beskrivs i följande avsnitt, tillsammans med en diskussion om ytterligare MIDL-kompilatorstöd för Stub Descriptor-strukturen för problem med bindningshandtag.

Implicita referenser

Om en procedur använder ett implicit handtag för bindning innehåller fältet handle_type<1> i procedurens beskrivning ett av tre giltiga icke-nollvärden. MIDL-kompilatorstöd för implicita referenser finns i fältet IMPLICIT_HANDLE_INFO i Stub Descriptor-strukturen:

typedef  (__RPC_FAR * GENERIC_BINDING_ROUTINE)();

typedef struct 
  {
  GENERIC_BINDING_ROUTINE  pfnBind;
  GENERIC_BINDING_ROUTINE  pfnUnbind;
  } GENERIC_BINDING_ROUTINE_PAIR;
  
typedef struct __GENERIC_BINDING_INFO 
  {
  void __RPC_FAR*          pObj;
  unsigned char            Size;
  GENERIC_BINDING_ROUTINE  pfnBind;
  GENERIC_BINDING_ROUTINE    pfnUnbind;
  } GENERIC_BINDING_INFO,  *PGENERIC_BINDING_INFO;

union 
  {
  handle_t*                pAutoHandle;
  handle_t*                pPrimitiveHandle;
  PGENERIC_BINDING_INFO    pGenericBindingInfo;
  } IMPLICIT_HANDLE_INFO;

Om proceduren använder ett automatiskt handtag innehåller pAutoHandle- medlem adressen för variabeln stub defined-auto handle.

Om proceduren använder ett implicit primitivt handtag innehåller pPrimitiveHandle-medlemmen adressen för den stub-definierade–primitiva referensvariabeln.

Om proceduren slutligen använder en implicit allmän referens innehåller pGenericBindingInfo medlem pekarens adress till motsvarande GENERIC_BINDING_INFO struktur. Datastrukturen MIDL_STUB_DESC innehåller en pekare till en samling GENERIC_BINDING_PAIR strukturer. Posten i nollpositionen för den här samlingen är reserverad för binda och obindade rutiner som motsvarar den generiska bindningsreferensen som refereras av pGenericBindingInfo i IMPLICIT_HANDLE_INFO. Typen av implicit bindningshandtag anges i formatsträngen.

Explicita referenser

Det finns tre möjliga explicita referenstyper: kontext, generisk och primitiv. När det gäller ett explicit handtag (eller en [ut] endast kontextreferens, som hanteras på samma sätt), visas informationen om bindningshandtaget som en av procedurens parametrar. De tre möjliga beskrivningarna är följande.

Primitiv

FC_BIND_PRIMITIVE, flag<1>, offset<2>.

Flaggan<1> anger om handtaget skickas av en pekare.

Förskjutningen<2> ger förskjutningen från början av stacken till det primitiva handtaget.

Not

En primitiv referensbeskrivning i typformatsträngen reduceras till en enda FC_IGNORE.

 

Allmän

FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD

Den flag_and _size<1> har den övre flaggan nibble och den lägre storleken nibble. Flaggan anger om handtaget skickas med en pekare. Storleksfältet ger storleken på den användardefinierade– generiska referenstypen. Den här storleken är begränsad till 1, 2 eller 4 byte på 32-bitarssystem och 1, 2, 4 eller 8 byte på 64-bitarssystem.

Förskjutningen<2> fältet ger förskjutningen från början av stacken för pekaren till data för den angivna storleken.

Fältet binding_routine_pair_index<1> ger indexet i fältet aGenericBindingRoutinePairs i stub-beskrivningen till binda och avbindade rutinmässiga funktionspekare för det generiska handtaget.

Not

En allmän referensbeskrivning i typformatet är endast beskrivningen av den relaterade datatypen.

 

Sammanhang

FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>

Flaggorna<1> anger hur handtaget skickas och vilken typ det är. Giltiga flaggor visas i följande tabell.

Hex Flagga
80 HANDLE_PARAM_IS_VIA_PTR
40 HANDLE_PARAM_IS_IN
20 HANDLE_PARAM_IS_OUT
21 HANDLE_PARAM_IS_RETURN
08 NDR_STRICT_CONTEXT_HANDLE
04 NDR_CONTEXT_HANDLE_NO_SERIALIZE
02 NDR_CONTEXT_HANDLE_SERIALIZE
01 NDR_CONTEXT_HANDLE_CANNOT_BE_NULL

 

De första fyra flaggorna har alltid funnits, de fyra senaste lades till i Windows 2000.

Fältet offset<2> ger förskjutningen från början av stacken till kontexthandtaget.

context_rundown_routine_index<1-> innehåller ett index i apfnNdrRundownRoutines fält i Stub Descriptor till den körningsrutin som används för kontexthandtaget. Kompilatorn genererar alltid ett index. För rutiner som inte har någon körningsrutin är detta ett index till en tabellposition som innehåller null.

För stubs som är inbyggda i –Oi2tillhandahåller param_num<1> ordningstalet, med början vid noll, som anger vilken kontext som hanterar det i den angivna proceduren.

För tidigare versioner av tolken innehåller param_num<1> kontextreferensens parameternummer, med början vid noll, i proceduren.

Not

En kontextreferensbeskrivning i typformatsträngen har inte förskjutningen<2> i beskrivningen.

 

Nytt -Oif-huvud

Som tidigare nämnts expanderar rubriken –Oif på rubriken –Oi. För enkelhetens skull visas alla fält här:

(Den gamla rubriken)

handle_type<1> 
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>  
stack_size<2>
[explicit_handle_description<>]

(tilläggen –Oif)

constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>

Constant_client_buffer_size<2> ger storleken på den marshaling-buffert som kunde ha förberäknats av kompilatorn. Detta kan bara vara en partiell storlek eftersom flaggan ClientMustSize utlöser storleksändringen.

constant_server_buffer_size<2-> ger storleken på bufferten för marskalkering som förberäknad av kompilatorn. Detta kan bara vara en partiell storlek eftersom flaggan ServerMustSize utlöser storleksändringen.

INTERPRETER_OPT_FLAGS definieras i Ndrtypes.h:

typedef struct
  {
  unsigned char   ServerMustSize      : 1;    // 0x01
  unsigned char   ClientMustSize      : 1;    // 0x02
  unsigned char   HasReturn           : 1;    // 0x04
  unsigned char   HasPipes            : 1;    // 0x08
  unsigned char   Unused              : 1;
  unsigned char   HasAsyncUuid        : 1;    // 0x20
  unsigned char   HasExtensions       : 1;    // 0x40
  unsigned char   HasAsyncHandle      : 1;    // 0x80
  } INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS;
  • ServerMustSize-biten anges om servern behöver utföra ett buffertstorlekspass.
  • ClientMustSize-biten anges om klienten behöver utföra ett buffertstorlekspass.
  • HasReturn-biten anges om proceduren har ett returvärde.
  • HasPipes-biten anges om rörpaketet behöver användas för att stödja ett pipe-argument.
  • HasAsyncUuid-biten anges om proceduren är en asynkron DCOM-procedur.
  • HasExtensions-biten anger att Windows 2000- och senare tillägg används.
  • HasAsyncHandle-biten anger en asynkron RPC-procedur.

HasAsyncHandle-biten har ursprungligen använts för en annan DCOM-implementering av asynkront stöd och kunde därför inte användas för det aktuella formatet asynkront stöd i DCOM. HasAsyncUuid-biten anger för närvarande detta.