Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Zo veel als twee delen in de notatietekenreeksbeschrijving van een procedureadresgrepen. Het eerste deel is het handle_type<1> veld van de beschrijving van een procedure, die wordt gebruikt om impliciete ingangen aan te geven. Dit deel is altijd aanwezig. Het tweede deel is een parameterbeschrijving van een expliciete ingang in de procedure. Beide worden in de volgende secties uitgelegd, samen met een bespreking van de aanvullende ONDERSTEUNING van de MIDL-compiler van de Stub Descriptor-structuur voor bindingsafhandelingsproblemen.
Impliciete ingangen
Als een procedure een impliciete ingang voor binding gebruikt, bevat het handle_type<1> veld van de beschrijving van de procedure een van de drie geldige niet-nulwaarden. ONDERSTEUNING voor MIDL-compiler voor impliciete ingangen vindt u in het IMPLICIT_HANDLE_INFO veld van de Stub Descriptor-structuur:
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;
Als voor de procedure een automatische ingang wordt gebruikt, bevat de pAutoHandle- lid het adres van de door stub gedefinieerde automatische handle-variabele.
Als de procedure gebruikmaakt van een impliciete primitieve ingang, bevat de pPrimitiveHandle lid het adres van de stub gedefinieerde primitieve ingangsvariabele.
Als de procedure ten slotte gebruikmaakt van een impliciete algemene ingang, bevat de pGenericBindingInfo lid het adres van de aanwijzer naar de bijbehorende GENERIC_BINDING_INFO structuur. De gegevensstructuur MIDL_STUB_DESC bevat een aanwijzer naar een verzameling GENERIC_BINDING_PAIR structuren. De vermelding in de nulpositie van deze verzameling is gereserveerd voor de bind en niet-gekoppelde routines die overeenkomen met de algemene binding die wordt verwezen door pGenericBindingInfo in IMPLICIT_HANDLE_INFO. Het type impliciete bindingsgreep wordt aangegeven in de notatietekenreeks.
Expliciete ingangen
Er zijn drie mogelijke expliciete handletypen: context, algemeen en primitief. In het geval van een expliciete ingang (of een [buiten] alleen contextgreep, die op dezelfde manier wordt verwerkt), wordt de binding handle-informatie weergegeven als een van de parameters van de procedure. De drie mogelijke beschrijvingen zijn als volgt.
Primitief
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
De vlag<1> geeft aan of de ingang wordt doorgegeven door een aanwijzer.
De offset<2> biedt de verschuiving van het begin van de stapel tot de primitieve ingang.
Notitie
Een primitieve handlebeschrijving in de tekenreeks van de typenotatie wordt beperkt tot één FC_IGNORE.
Generiek
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
De flag_and _size<1> heeft de bovenste vlagknabbel en de kleine knabbel. De vlag geeft aan of de ingang wordt doorgegeven door een aanwijzer. Het veld Grootte biedt de grootte van het door de gebruiker gedefinieerde, algemene handletype. Deze grootte is beperkt tot 1, 2 of 4 bytes op 32-bits systemen en 1, 2, 4 of 8 bytes op 64-bits systemen.
De offset<2> veld biedt de verschuiving van het begin van de stapel van de aanwijzer naar de gegevens van de opgegeven grootte.
Het veld binding_routine_pair_index<1> geeft de index in het veld aGenericBindingRoutinePairs van de Stub Descriptor aan de bind en ongebinde routinefunctieaanwijzers voor de algemene greep.
Notitie
Een algemene handlebeschrijving in de typeindeling is alleen de beschrijving van het gerelateerde gegevenstype.
Context
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
De vlaggen<1> aangeven hoe de ingang wordt doorgegeven en welk type het is. Geldige vlaggen worden weergegeven in de volgende tabel.
| Hex | Vlag |
|---|---|
| 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 eerste vier vlaggen zijn altijd aanwezig, de laatste vier zijn toegevoegd in Windows 2000.
Het offsetveld<2> biedt de verschuiving van het begin van de stack naar de contextgreep.
De context_rundown_routine_index<1> biedt een index in het apfnNdrRundownRoutines veld van de Stub Descriptor voor de uitvoeringsroutine die voor deze contextgreep wordt gebruikt. De compiler genereert altijd een index. Voor routines die geen rundown-routine hebben, is dit een index naar een tabelpositie die null bevat.
Voor stubs die zijn gebouwd in -Oi2, levert de param_num<1> het rangtelgetal, beginnend bij nul, waarmee wordt opgegeven welke context deze in de opgegeven procedure verwerkt.
Voor eerdere versies van de interpreter biedt de param_num<1> het parameternummer van de contextgreep, beginnend bij nul, in de procedure.
Notitie
Een beschrijving van de contextgreep in de tekenreeks voor de indeling van het type bevat niet de offset<2> in de beschrijving.
De nieuwe -Oif-header
Zoals eerder vermeld, wordt de koptekst van de -Oif- uitgebreid op de koptekst -Oi. Voor het gemak worden alle velden hier weergegeven:
(De oude koptekst)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
(De -Oif extensies)
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
De constant_client_buffer_size<2> biedt de grootte van de marshalingbuffer die vooraf kan zijn berekend door de compiler. Dit kan slechts een gedeeltelijke grootte zijn, omdat de vlag ClientMustSize de grootte activeert.
De constant_server_buffer_size<2> biedt de grootte van de marshalingbuffer zoals vooraf ingevuld door de compiler. Dit kan slechts een gedeeltelijke grootte zijn, omdat de vlag ServerMustSize de grootte activeert.
De INTERPRETER_OPT_FLAGS worden gedefinieerd in 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;
- De bit ServerMustSize is ingesteld als de server een buffergroottepas moet uitvoeren.
- De Bit ClientMustSize wordt ingesteld als de client een buffergroottepas moet uitvoeren.
- De HasReturn-bit wordt ingesteld als de procedure een retourwaarde heeft.
- De HasPipes-bit wordt ingesteld als het pipe-pakket moet worden gebruikt om een pipe-argument te ondersteunen.
- De HasAsyncUuid-bit wordt ingesteld als de procedure een asynchrone DCOM-procedure is.
- De HasExtensions-bit geeft aan dat extensies voor Windows 2000 en hoger worden gebruikt.
- De HasAsyncHandle-bit geeft een asynchrone RPC-procedure aan.
De HasAsyncHandle-bit is in eerste instantie gebruikt voor een andere DCOM-implementatie van asynchrone ondersteuning en kan daarom niet worden gebruikt voor de huidige asynchrone stijlondersteuning in DCOM. De HasAsyncUuid-bit geeft dit momenteel aan.