Ovládá
V popisu řetězce formátu popisovačů adresy procedury je tolik jako dvě části. První částí je pole handle_type<1> popisu procedury, které slouží k označení implicitních popisovačů. Tato část je vždy přítomna. Druhá část je popis parametru libovolného explicitního popisovače v postupu. Obě jsou vysvětleny v následujících částech spolu s diskuzí o další podpoře kompilátoru MIDL struktury popisovače zástupných procedur pro problémy s popisovačem vazby.
Implicitní popisovače
Pokud procedura používá implicitní popisovač pro vazbu, obsahuje pole handle_type<1> popisu procedury jednu ze tří platných nenulových hodnot. Podpora kompilátoru MIDL pro implicitní popisovače se nachází v poli IMPLICIT_HANDLE_INFO struktury popisovače zástupných procedur:
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;
Pokud procedura používá automatický popisovač, pAutoHandle člen obsahuje adresu proměnné automatického popisovače definované zástupných procedur.
Pokud procedura používá implicitní primitivní popisovač, pPrimitiveHandle člen obsahuje adresu stub defined-primitive handle proměnné.
A konečně, pokud procedura používá implicitní obecný popisovač, pGenericBindingInfo člen obsahuje adresu ukazatele na odpovídající GENERIC_BINDING_INFO struktury. Datová struktura MIDL_STUB_DESC obsahuje ukazatel na kolekci GENERIC_BINDING_PAIR struktur. Položka v nulové pozici této kolekce je vyhrazena pro vazby a unbind rutin odpovídající obecné vazby popisovače odkazované pGenericBindingInfo v IMPLICIT_HANDLE_INFO. Typ implicitního popisovače vazby je uveden v řetězci formátu.
Explicitní popisovače
Existují tři možné explicitní typy popisovačů: kontext, obecný a primitivní. V případě explicitního popisovače (nebo [ven] pouze kontextového popisovače, který se zpracovává stejným způsobem), se informace o popisovači vazby zobrazí jako jeden z parametrů procedury. Tři možné popisy jsou následující.
Primitivní
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
Příznak<1> označuje, jestli je popisovač předán ukazatelem.
Posun<2> poskytuje posun od začátku zásobníku na primitivní popisovač.
Poznámka
Primitivní popis popisovač v řetězci formátu typu se zmenší na jeden FC_IGNORE.
Generický
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
Flag_and _size<1> má horní příznak nibble a menší velikost nibble. Příznak označuje, zda je popisovač předán ukazatelem. Pole velikost poskytuje velikost uživatelem definovaného obecného typu popisovače. Tato velikost je omezená na 1, 2 nebo 4 bajty v 32bitových systémech a 1, 2, 4 nebo 8 bajtů v 64bitových systémech.
Posun<2> pole poskytuje posun od začátku zásobníku ukazatele na data dané velikosti.
Pole binding_routine_pair_index<1> poskytuje index do pole aGenericBindingRoutinePairs popisovače zástupných procedur k vazbě a ukazatelích rutinní funkce pro obecný popisovač.
Poznámka
Obecný popis popisovač ve formátu typu je popis pouze souvisejícího datového typu.
Kontext
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
Příznaky<1> označují, jak je popisovač předán a o jaký typ se jedná. Platné příznaky jsou uvedeny v následující tabulce.
Šestnáctkový | Vlajka |
---|---|
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 |
První čtyři příznaky byly vždy přítomny, poslední čtyři byly přidány v systému Windows 2000.
Posun<2> pole poskytuje posun od začátku zásobníku na kontextový popisovač.
Context_rundown_routine_index<1> poskytuje index do apfnNdrRundownRoutines pole popisovače zástupných procedur do rutiny rundownu používané pro tento popisovač kontextu. Kompilátor vždy generuje index. U rutin, které nemají rutinu rundownu, je to index na pozici tabulky, která obsahuje hodnotu null.
U procedur integrovaných v –Oi2poskytuje param_num<1> pořadový počet, počínaje nulou a určuje, který kontextový popisovač je v daném postupu.
U předchozích verzí interpreta poskytuje param_num<1> číslo parametru popisovače kontextu počínaje nulou v jeho postupu.
Poznámka
Popis popisovače kontextu v řetězci formátu typu nebude mít posun<2> v popisu.
Nová hlavička –Oif
Jak už jsme zmínili dříve, záhlaví –Oif se rozbalí v záhlaví –Oi. Pro usnadnění používání jsou všechna pole zobrazená zde:
(Původní záhlaví)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
(Rozšíření –Oif)
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
Constant_client_buffer_size<2> poskytuje velikost vyrovnávací paměti pro zařazování, kterou mohl kompilátor předem vypočítat. Může to být jenom částečná velikost, protože příznak ClientMustSize aktivuje změnu velikosti.
Constant_server_buffer_size<2> poskytuje velikost vyrovnávací paměti pro zařazování, jak je předpočítá kompilátor. Může to být jenom částečná velikost, protože příznak ServerMustSize aktivuje změnu velikosti.
INTERPRETER_OPT_FLAGS jsou definovány v 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;
- Bit ServerMustSize je nastaven, pokud server potřebuje provést průchod velikosti vyrovnávací paměti.
- Bit ClientMustSize je nastaven, pokud klient potřebuje provést průchod velikosti vyrovnávací paměti.
- Bit HasReturn je nastaven, pokud má procedura návratovou hodnotu.
- Bit HasPipes je nastaven, pokud se balíček kanálu musí použít k podpoře argumentu kanálu.
- Bit HasAsyncUuid je nastaven, pokud je procedura asynchronní procedura modelu DCOM.
- Bit HasExtensions označuje, že se používají rozšíření systému Windows 2000 a novější.
- Bit HasAsyncHandle označuje asynchronní proceduru RPC.
Bit HasAsyncHandle byl původně použit pro jinou implementaci modelu DCOM asynchronní podpory, a proto nebylo možné použít pro aktuální podporu async stylu v modelu DCOM. Bit HasAsyncUuid aktuálně označuje.