Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Attributet [context_handle] identifierar en bindningsreferens som upprätthåller kontext- eller tillståndsinformation på servern mellan fjärrproceduranrop.
typedef [context_handle [ , type-attribute-list ] ] type-specifier declarator-list;
[context_handle [, function-attr-list ] ] type-specifier [ptr-decl] function-name(
[ [parameter-attribute-list] ] type-specifier [declarator], ...);
[ [ function-attr-list ] ] type-specifier [ ptr-decl ] function-name(
[context_handle [ , parameter-attribute-list ] ] type-specifier [declarator], ...);
[ void __RPC_USER context-handle-type_rundown (
context-handle-type); ]
Parameters
-
type-attribute-list
-
Anger ett eller flera attribut som gäller för typen.
-
type-specifier
-
Anger en pekartyp eller en typidentifierare. En valfri lagringsspecifikation kan föregå typspecificeraren.
-
deklarator och deklaratorlista
-
Anger C-standarddeklaratorer, till exempel identifierare, pekardeklaratorer och matrisdeklaratorer. Deklaratorn för en kontextreferens måste innehålla minst en pekardeklarator. Mer information finns i Matriser och Sized-Pointer attribut, matriser och matriser och pekare. Deklaratorlistan består av en eller flera deklaratorer, avgränsade med kommatecken. Parameternamnidentifieraren i funktionsdeklaratorn är valfri.
-
function-attr-list
-
Anger noll eller fler attribut som gäller för funktionen. Giltiga funktionsattribut är [callback], [local]; pekarattributet [ref], [unique], eller [ptr]; och användningsattributen [string], [ignore], och [context_handle].
-
ptr-decl
-
Anger noll eller fler pekardeklaratorer. En pekardeklarator är samma som pekardeklaratorn som används i C. den är konstruerad av * designatorn, modifierare som långt och kvalstrecket.
-
function-name
-
Anger namnet på fjärrproceduren.
-
parameter-attribute-list
-
Anger noll eller fler riktningsattribut, fältattribut, användningsattribut och pekarattribut som är lämpliga för den angivna parametertypen. Avgränsa flera attribut med kommatecken.
-
context-handle-type
-
Anger identifieraren som anger kontextreferenstypen enligt definitionen i en typedef-deklaration som tar attributet [context_handle]. Körningsrutinen är valfri.
Windows Server 2003 och Windows XP: Ett enda gränssnitt kan hantera både serialiserade och icke-ialiserade kontextreferenser, vilket gör att en metod i ett gränssnitt kan komma åt en kontextreferens exklusivt (serialiserad), medan andra metoder kommer åt kontexten som hanterar i delat läge (icke-ialiserad). Dessa åtkomstfunktioner är jämförbara med låsningsmekanismer för läsning/skrivning. metoder som använder ett serialiserat kontexthandtag är exklusiva användare (skrivare), medan metoder som använder en icke-ialiserad kontextreferens är delade användare (läsare). Metoder som förstör eller ändrar tillståndet för en kontextreferens måste serialiseras. Metoder som inte ändrar tillståndet för en kontextreferens, till exempel de metoder som helt enkelt läser från ett kontexthandtag, kan vara icke-ialiserade. Observera att skapandemetoder är implicit serialiserade.
Anmärkningar
Attributet [context_handle] kan visas som ett IDL typedef-typattribut , som ett funktionsreturtypattribut eller som ett parameterattribut. När du tillämpar attributet [context_handle] på en typdefinition måste du också ange en kontextrutin för nedkörning. Mer information finns i Körningsrutin för serverkontext .
När du använder MIDL-kompilatorn i standardläge (/ms_ext) kan en kontextreferens vara valfri pekartyp som användaren har valt, förutsatt att den uppfyller kraven för kontextreferenser som beskrivs här. Data som är associerade med en sådan kontextreferenstyp överförs inte i nätverket och bör endast manipuleras av serverprogrammet. DCE IDL-kompilatorer begränsar kontextreferenser till pekare av typen void*. Därför är den här funktionen inte tillgänglig när du använder MIDL-kompilatorn /osf-växeln .
Precis som med andra referenstyper är kontextreferensen ogenomskinlig för klientprogrammet och alla data som är associerade med det överförs inte. På servern fungerar kontexthandtaget som ett handtag för aktiv kontext och alla data som är associerade med kontexthandtagstypen är tillgängliga.
För att skapa ett kontexthandtag skickar klienten till servern en [out], [ref] pekare till ett kontexthandtag. (Själva kontexthandtaget kan ha ett NULL - eller icke-NULL-värde , så länge dess värde är konsekvent med dess pekarattribut. När kontextreferenstypen till exempel har attributet [ref] tillämpat på den kan den inte ha ett NULL-värde .) En annan bindningsreferens måste anges för att utföra bindningen tills kontexthandtaget har skapats. När inget explicit handtag har angetts används implicit bindning. När det inte finns något [implicit_handle] -attribut används ett automatiskt handtag.
Fjärrproceduren på servern skapar en aktiv kontextreferens. Klienten måste använda kontextreferensen som en [i] eller [in, ut] parameter i efterföljande anrop. En [i]-endast kontextreferens kan användas som ett bindningshandtag, så det måste ha ett icke-NULL-värde . En [in]-only-kontextreferens återspeglar inte tillståndsändringar på servern.
På servern kan den anropade proceduren tolka kontexthandtaget efter behov. Den anropade proceduren kan till exempel allokera heaplagring och använda kontexthandtaget som en pekare till den här lagringen.
För att stänga ett kontexthandtag skickar klienten kontexthandtaget som ett [in], [out]- argument. Servern måste returnera en NULL-kontextreferens när den inte längre behåller kontexten åt anroparen. Om kontextreferensen till exempel representerar en öppen fil och anropet stänger filen, måste servern ange kontextreferensen till NULL och returnera den till klienten. Ett NULL-värde är ogiltigt som bindningshandtag för efterföljande anrop.
En kontextreferens är endast giltig för en server. När en funktion har två referensparametrar och kontextreferensen inte är NULL, måste bindningshandtagen referera till samma adressutrymme.
När en funktion har en [in] eller en [in, ut] kontextreferens kan dess kontexthandtag användas som bindningshandtag. I det här fallet används inte implicit bindning och attributet [implicit_handle] eller [auto_handle] ignoreras.
Följande begränsningar gäller för kontextreferenser:
- Kontextreferenser får inte vara matriselement, strukturmedlemmar eller fackföreningsmedlemmar. De kan bara vara parametrar.
- Kontextreferenser kan inte ha attributet [transmit_as] eller [represent_as].
- Parametrar som pekar på [out] -kontexthandtag måste vara [referens] pekare.
- En [i] kontextreferens kan användas som bindningshandtag och kan inte vara NULL.
- En [in- och ut-kontextreferens kan vara NULL för indata, men bara om proceduren har en annan explicit referensparameter. Om det inte finns några andra explicita icke-NULL-kontextreferensparametrar kan kontextreferensen [in och ut] inte vara NULL.
- Det går inte att använda en kontextreferens med motringningar.
Exempel
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
short RemoteFunc1([out] PCONTEXT_HANDLE_TYPE * pCxHandle);
short RemoteFunc2([in, out] PCONTEXT_HANDLE_TYPE * pCxHandle);
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown (PCONTEXT_HANDLE_TYPE);
Se även