Sdílet prostřednictvím


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.