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.