Udostępnij za pośrednictwem


Obsługuje

Aż dwie części w opisie ciągu formatu dojścia adresu procedury. Pierwszą częścią jest pole handle_type<1> opisu procedury, używane do wskazywania niejawnych dojść. Ta część jest zawsze obecna. Druga część to opis parametru każdego jawnego dojścia w procedurze. Oba zostały wyjaśnione w poniższych sekcjach wraz z omówieniem dodatkowej obsługi kompilatora MIDL struktury deskryptora stub na potrzeby problemów z obsługą powiązań.

Dojścia niejawne

Jeśli procedura używa niejawnego dojścia do powiązania, pole handle_type<1> opisu procedury zawiera jedną z trzech prawidłowych wartości niezerowych. Obsługa kompilatora MIDL dla niejawnych dojść znajduje się w polu IMPLICIT_HANDLE_INFO struktury deskryptora stub:

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;

Jeśli procedura używa uchwytu automatycznego, element członkowski pAutoHandle zawiera adres zmiennej obsługi automatycznej zdefiniowanej przez wycinkę.

Jeśli procedura używa niejawnego dojścia pierwotnego, element członkowski pPrimitiveHandle zawiera adres zmiennej obsługi pierwotnej zdefiniowanej przez wycinkę.

Na koniec, jeśli procedura używa niejawnego dojścia ogólnego, element członkowski pGenericBindingInfo przechowuje adres wskaźnika do odpowiedniej struktury GENERIC_BINDING_INFO. Struktura danych MIDL_STUB_DESC zawiera wskaźnik do kolekcji struktur GENERIC_BINDING_PAIR. Wpis w pozycji zerowej tej kolekcji jest zarezerwowany dla wiązania i procedur bez powiązania odpowiadających obsłudze powiązania ogólnego, do których odwołuje się pGenericBindingInfo w IMPLICIT_HANDLE_INFO. Typ niejawnego uchwytu powiązania jest wskazywany w ciągu formatu.

Jawne dojścia

Istnieją trzy możliwe jawne typy obsługi: kontekst, ogólny i pierwotny. W przypadku jawnego dojścia (lub [się] tylko dojścia kontekstu, który jest obsługiwany w ten sam sposób), informacje dojścia powiązania są wyświetlane jako jeden z parametrów procedury. Trzy możliwe opisy są następujące.

Prymitywny

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

Flaga<1> wskazuje, czy uchwyt jest przekazywany przez wskaźnik.

Przesunięcie<2> zapewnia przesunięcie od początku stosu do uchwytu pierwotnego.

Nuta

Opis dojścia pierwotnego w ciągu formatu typu jest zredukowany do pojedynczego FC_IGNORE.

 

Rodzajowy

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

Flag_and _size<1> ma górną flagę nibble i niższy rozmiar nibble. Flaga wskazuje, czy uchwyt jest przekazywany przez wskaźnik. Pole rozmiaru zawiera rozmiar zdefiniowanego przez użytkownika typu dojścia ogólnego. Ten rozmiar jest ograniczony do 1, 2 lub 4 bajtów w systemach 32-bitowych i 1, 2, 4 lub 8 bajtów w systemach 64-bitowych.

Przesunięcie<2> pole zapewnia przesunięcie od początku stosu wskaźnika do danych o danym rozmiarze.

Pole binding_routine_pair_index<1> daje indeks do pola aGenericBindingRoutinePairs deskryptora wycinków do powiązania i niezwiązanych rutynowych wskaźników funkcji dla uchwytu ogólnego.

Nuta

Ogólny opis uchwytu w formacie typu to opis tylko powiązanego typu danych.

 

Kontekst

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

Flagi<1> wskazują, jak jest przekazywany uchwyt i jaki typ jest. Prawidłowe flagi są wyświetlane w poniższej tabeli.

Urok Flaga
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

 

Pierwsze cztery flagi zawsze były obecne, ostatnie cztery zostały dodane w systemie Windows 2000.

Przesunięcie<2> pole zapewnia przesunięcie od początku stosu do uchwytu kontekstu.

Context_rundown_routine_index<1> udostępnia indeks do apfnNdrRundownRoutines pola deskryptora wycinków do procedury uruchamiania używanej na potrzeby tego uchwytu kontekstu. Kompilator zawsze generuje indeks. W przypadku procedur, które nie mają procedury uruchamiania, jest to indeks do pozycji tabeli, która zawiera wartość null.

W przypadku wycinków wbudowanych w –Oi2param_num<1> zapewnia liczbę porządkową, zaczynając od zera, określając, która obsługa kontekstu znajduje się w danej procedurze.

W przypadku poprzednich wersji interpretera param_num<1> udostępnia numer parametru dojścia kontekstu, zaczynając od zera, w swojej procedurze.

Nuta

Opis uchwytu kontekstu w ciągu formatu typu nie będzie miał przesunięcia<2> w opisie.

 

Nowy nagłówek –Oif

Jak wspomniano wcześniej, nagłówek –Oif rozwija się w nagłówku –Oi. Dla wygody wszystkie pola są wyświetlane tutaj:

(Stary nagłówek)

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

(Rozszerzenia –Oif)

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

Constant_client_buffer_size<2> zapewnia rozmiar buforu marshalingu, który mógł zostać wstępnie obliczony przez kompilator. Może to być tylko rozmiar częściowy, ponieważ flaga ClientMustSize wyzwala rozmiar.

Constant_server_buffer_size<2> zapewnia rozmiar buforu marshalingu wstępnie skompilowany przez kompilator. Może to być tylko rozmiar częściowy, ponieważ flaga ServerMustSize wyzwala ustalanie rozmiaru.

INTERPRETER_OPT_FLAGS są zdefiniowane w pliku 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 jest ustawiony, jeśli serwer musi wykonać przekazywanie rozmiaru buforu.
  • Bit ClientMustSize jest ustawiany, jeśli klient musi wykonać przekazywanie rozmiaru buforu.
  • Bit HasReturn jest ustawiany, jeśli procedura ma wartość zwracaną.
  • Bit HasPipes jest ustawiony, jeśli pakiet potoku musi być używany do obsługi argumentu potoku.
  • Bit HasAsyncUuid jest ustawiany, jeśli procedura jest procedurą asynchroniczną DCOM.
  • Bit HasExtensions wskazuje, że są używane rozszerzenia systemu Windows 2000 i nowszych.
  • Bit HasAsyncHandle wskazuje asynchroniczną procedurę RPC.

Bit HasAsyncHandle został początkowo użyty do innej implementacji modelu DCOM obsługi asynchronicznego i dlatego nie można go użyć do bieżącej obsługi asynchronicznego stylu w modelu DCOM. Obecnie wskazuje to bit HasAsyncUuid.