Udostępnij za pośrednictwem


Korzystanie z moniker sesji

Aktywacja sesji do sesji umożliwia procesowi klienta aktywowanie procesu serwera lokalnego w określonej sesji. Można to zrobić na sesyjnym poziomie, używając monikera sesji dostarczonego przez system. Aby uzyskać więcej informacji na temat tworzenia identyfikatora sesji, zobacz Aktywacja sesji do sesji za pomocą identyfikatora sesji.

Poniższy przykład pokazuje, jak aktywować proces serwera lokalnego z identyfikatorem klasy "100000013-0000-0000-0000-00000000001" w sesji o identyfikatorze 3 sesji.

Najpierw przykład wywołuje funkcję CoInitialize w celu zainicjowania biblioteki COM. Następnie przykładowe wywołanie CreateBindCtx służy do pobrania wskaźnika do implementacji interfejsu IBindCtx. Ten obiekt przechowuje informacje o operacjach moniker-binding; wskaźnik jest wymagany do wywoływania metod interfejsu IMoniker. Następnie przykład wywołuje funkcję MkParseDisplayNameEx w celu utworzenia kompozytowego monikera sesji, a następnie metodę IMoniker::BindToObject do aktywowania połączenia między klientem a procesem serwera, przy użyciu nowo utworzonego kompozytowego monikera sesji. W tym momencie możesz użyć wskaźnika interfejsu, aby wykonać żądane operacje na obiekcie. Na koniec przykład zwalnia kontekst powiązania i wywołuje funkcję CoUninitialize.

// Initialize COM.

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) exit(0);  // Handle errors here.

// Get interface pBindCtx.

IBindCtx* pBindCtx;
hr = CreateBindCtx(NULL, &pBindCtx);
if (FAILED(hr)) exit(0);  // Handle errors here.

// Get moniker pMoniker.

OLECHAR string[] =
    L"Session:3!clsid:10000013-0000-0000-0000-000000000001";
ULONG ulParsed;
IMoniker* pMoniker;
hr = MkParseDisplayNameEx( pBindCtx,
                           string,
                           &ulParsed,
                           &pMoniker
                          );
if (FAILED(hr)) exit(0);  // Handle errors here.

// Get object factory pSessionTestFactory.

IUnknown* pSessionTestFactory;
hr = pMoniker->BindToObject( pBindCtx,
                             NULL,
                             IID_IUnknown,
                             (void**)&pSessionTestFactory
                            );
if (FAILED(hr)) exit(0);  // Handle errors here.

//
// Make, use, and destroy object here.
//
pSessionTestFactory->Release();
pSessionTestFactory = NULL;

pMoniker->Release();  // Release moniker.

pBindCtx->Release();  // Release interface.

CoUninitialize();  // Release COM.

Ponieważ "{identyfikator klasy moniker}" jest również sposobem na nazwanie monikera klasy, możesz użyć następującego ciągu, aby nazwać monikera złożonego (moniker sesji skomponowany z monikerem klasy) zamiast sposobu pokazanym w poprzednim przykładzie.

OLECHAR string[] = 
    L"Session:3!{0000031A-0000-0000-C000-000000000046}:
    10000013-0000-0000-0000-000000000001";

Notatka

Jeśli ten sam użytkownik jest zalogowany do każdej sesji podczas aktywacji między sesjami, można pomyślnie aktywować dowolny proces serwera skonfigurowany do uruchomienia w trybie aktywacji Uruchom jako interaktywny użytkownik. Jeśli różni użytkownicy są zalogowani do każdej sesji, serwer musi wywołać funkcję CoInitializeSecurity, aby ustawić odpowiednie prawa użytkownika przed pomyślną aktywacją i połączeniem między klientem a serwerem. Jednym ze sposobów osiągnięcia tego celu byłoby, gdyby serwer zaimplementował niestandardowy interfejs IAccessControl i przekazał tę implementację do CoInitializeSecurity. W każdym razie użytkownik klienta musi mieć odpowiednie Uruchom i uprawnienia dostępu określone przez aplikację działającą na serwerze. Aby uzyskać więcej informacji, zobacz Security in COM.

 

Aby uzyskać więcej informacji na temat monikerów dostarczonych przez system i monikerów oraz trybów aktywacji, zobacz Monikers, interfejs IMoniker oraz AppId Key w dokumentacji COM w zestawie SDK Platformy.