atrybut context_handle

Atrybut [context_handle] identyfikuje uchwyt powiązania, który utrzymuje kontekst lub informacje o stanie na serwerze między zdalnymi wywołaniami procedur.

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); ]

Parametry

type-attribute-list

Określa co najmniej jeden atrybut, który ma zastosowanie do typu.

specyfikator typu

Określa typ wskaźnika lub identyfikator typu. Opcjonalna specyfikacja magazynu może poprzedzać specyfikator typów.

deklarator i deklarator-lista

Określa standardowe deklaratory języka C, takie jak identyfikatory, deklaratory wskaźników i deklaratory tablicy. Deklarator dla uchwytu kontekstu musi zawierać co najmniej jeden deklarator wskaźnika. Aby uzyskać więcej informacji, zobacz Tablice i Sized-Pointer Atrybuty, tablice i tablice i wskaźniki. Lista deklaratorów składa się z co najmniej jednego deklaratora oddzielonego przecinkami. Identyfikator nazwy parametru w deklaratorze funkcji jest opcjonalny.

function-attr-list

Określa zero lub więcej atrybutów, które mają zastosowanie do funkcji. Prawidłowe atrybuty funkcji to [wywołanie zwrotne], [lokalne]; atrybut wskaźnika [ref], [unique]lub [ptr]; oraz atrybuty użycia [string], [ignoruj]i [context_handle].

ptr-decl

Określa zero lub więcej deklaratorów wskaźników. Deklarator wskaźnika jest taki sam jak deklarator wskaźnika używany w języku C; jest zbudowany z projektanta * , modyfikatorów, takich jak daleko, i kwalifikatora const.

nazwa funkcji

Określa nazwę procedury zdalnej.

parametr-attribute-list

Określa zero lub więcej atrybutów kierunkowych, atrybutów pola, atrybutów użycia i atrybutów wskaźnika odpowiednich dla określonego typu parametru. Rozdziel wiele atrybutów przecinkami.

typ-dojścia kontekstu

Określa identyfikator określający typ uchwytu kontekstu zgodnie z definicją w deklaracji typedef, która przyjmuje atrybut [context_handle]. Procedury uruchamiania są opcjonalne.

Windows Server 2003 i Windows XP: Pojedynczy interfejs może pomieścić zarówno serializowane, jak i nieserializowane dojścia kontekstu, włączając jedną metodę w interfejsie w celu uzyskania dostępu do dojścia kontekstu wyłącznie (serializowane), podczas gdy inne metody uzyskują dostęp do tego kontekstu w trybie udostępnionym (nieserializowany). Te możliwości dostępu są porównywalne z mechanizmami blokowania odczytu/zapisu; metody korzystające z zserializowanego uchwytu kontekstu są wyłącznymi użytkownikami (pisarzami), natomiast metody korzystające z nieserializowanego uchwytu kontekstu są współużytkowanymi użytkownikami (czytelnikami). Metody, które niszczą lub modyfikują stan uchwytu kontekstu, muszą być serializowane. Metody, które nie modyfikują stanu uchwytu kontekstu, takie jak metody, które po prostu odczytują z uchwytu kontekstu, mogą być nieserializowane. Należy pamiętać, że metody tworzenia są niejawnie serializowane.

Uwagi

Atrybut [context_handle] może być wyświetlany jako atrybut typu IDL typedef , jako atrybut zwracany przez funkcję lub jako atrybut parametru. Po zastosowaniu atrybutu [context_handle] do definicji typu należy również podać procedurę uruchamiania kontekstu. Aby uzyskać szczegółowe informacje, zobacz Procedurę uruchamiania kontekstu serwera .

W przypadku korzystania z kompilatora MIDL w trybie domyślnym (/ms_ext) uchwyt kontekstu może być dowolnym typem wskaźnika wybranym przez użytkownika, o ile spełnia wymagania dotyczące obsługi kontekstowych opisanych tutaj. Dane skojarzone z takim typem uchwytu kontekstu nie są przesyłane w sieci i powinny być manipulowane tylko przez aplikację serwera. Kompilatory IDL DCE ograniczają dojścia kontekstu do wskaźników typu void*. W związku z tym ta funkcja nie jest dostępna w przypadku korzystania z przełącznika /osf kompilatora MIDL.

Podobnie jak w przypadku innych typów obsługi, dojście kontekstowe jest nieprzezroczyste dla aplikacji klienckiej, a wszystkie skojarzone z nim dane nie są przesyłane. Na serwerze dojście kontekstowe służy jako uchwyt w aktywnym kontekście, a wszystkie dane skojarzone z typem uchwytu kontekstu są dostępne.

Aby utworzyć uchwyt kontekstu, klient przekazuje do serwera wskaźnik [out], [ref] do uchwytu kontekstu. (Sam uchwyt kontekstu może mieć wartość NULL lub inną niż NULL , o ile jego wartość jest spójna z atrybutami wskaźnika. Na przykład gdy typ uchwytu kontekstu ma zastosowany atrybut [ref], nie może mieć wartości NULL . Do momentu utworzenia dojścia kontekstu należy podać kolejny uchwyt powiązania. Jeśli nie określono jawnego uchwytu, jest używane powiązanie niejawne. Jeśli atrybut [implicit_handle] nie jest obecny, jest używany dojście automatyczne.

Procedura zdalna na serwerze tworzy aktywny uchwyt kontekstu. Klient musi używać tego kontekstu do obsługi jako parametru [in] lub [in, out] w kolejnych wywołaniach. Dojście kontekstowe [w]-only może być używane jako uchwyt powiązania, więc musi mieć wartość inną niż NULL . Dojście kontekstowe typu [in]nie odzwierciedla zmian stanu na serwerze.

Na serwerze wywołana procedura może interpretować uchwyt kontekstu zgodnie z potrzebami. Na przykład wywołana procedura może przydzielić magazyn stert i użyć uchwytu kontekstu jako wskaźnika do tego magazynu.

Aby zamknąć uchwyt kontekstu, klient przekazuje dojście kontekstu jako argument [in], [out]. Serwer musi zwrócić uchwyt kontekstu NULL , gdy nie utrzymuje już kontekstu w imieniu obiektu wywołującego. Jeśli na przykład dojście kontekstowe reprezentuje otwarty plik, a wywołanie zamyka plik, serwer musi ustawić uchwyt kontekstu na wartość NULL i zwrócić go do klienta. Wartość NULL jest nieprawidłowa jako uchwyt powiązania w kolejnych wywołaniach.

Dojście kontekstowe jest prawidłowe tylko dla jednego serwera. Jeśli funkcja ma dwa parametry dojścia, a dojście kontekstu nie ma wartości NULL, dojścia powiązań muszą odwoływać się do tej samej przestrzeni adresowej.

Gdy funkcja ma uchwyt kontekstu [in] lub [in, out], jego uchwyt kontekstu może być używany jako uchwyt powiązania. W takim przypadku powiązanie niejawne nie jest używane, a atrybut [implicit_handle] lub [auto_handle] jest ignorowany.

Następujące ograniczenia dotyczą dojścia kontekstu:

  • Uchwyty kontekstowe nie mogą być elementami tablicy, składowymi struktury ani członkami unii. Mogą to być tylko parametry.
  • Dojścia kontekstu nie mogą mieć atrybutu [transmit_as] ani [represent_as].
  • Parametry wskazujące na [out] dojścia kontekstu muszą być wskaźnikami [ref].
  • Uchwyt kontekstu [in] może być używany jako uchwyt powiązania i nie może mieć wartości NULL.
  • [ in, out context handle może mieć wartość NULL w danych wejściowych, ale tylko wtedy, gdy procedura ma inny jawny parametr dojścia. Jeśli nie ma żadnych innych jawnych parametrów dojścia kontekstu innego niż NULL , dojście kontekstu [in, out] nie może mieć wartości NULL.
  • Nie można używać uchwytu kontekstowego z wywołaniami zwrotnymi.

Examples

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);

Zobacz także

Tablice

auto_handle

Wywołania zwrotnego

Resetowanie kontekstu klienta

Const

Dojścia kontekstu

Obsługi

Wiązanie i uchwyty

Ignoruj

implicit_handle

Cala

Lokalnych

Wielowątkowi klienci i uchwyty kontekstowe

/ms_ext

na wyję

Ptr

Ref

represent_as

RpcSsDestroyClientContext

Procedury uruchamiania kontekstu serwera

Ciąg

transmit_as

Typedef

Unikatowy

Void