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.