Verwenden eines Sitzungsmonikers
Die Aktivierung von Sitzungen ermöglicht es einem Clientprozess, einen lokalen Serverprozess für eine angegebene Sitzung zu aktivieren. Sie können dies auf Sitzungsbasis mithilfe eines vom System bereitgestellten Sitzungsmonikers tun. Weitere Informationen zum Erstellen eines Sitzungsmonikers finden Sie unter Session-to-Session Activation with a Session Moniker .For more information about creating a session moniker, see Session-to-Session Activation with a Session Moniker.
Das folgende Beispiel zeigt, wie Sie einen lokalen Serverprozess mit der Klassen-ID "10000013-0000-0000-0000-0000000000001" für die Sitzung mit der Sitzungs-ID 3 aktivieren.
Zunächst ruft das Beispiel die CoInitialize-Funktion auf, um die COM-Bibliothek zu initialisieren. Anschließend ruft das Beispiel CreateBindCtx auf, um einen Zeiger auf eine Implementierung der IBindCtx-Schnittstelle abzurufen. Dieses Objekt speichert Informationen zu Monikerbindungsvorgängen. Der Zeiger ist erforderlich, um Methoden der IMoniker-Schnittstelle aufzurufen. Als Nächstes ruft das Beispiel die MkParseDisplayNameEx-Funktion auf, um den zusammengesetzten Sitzungsmoniker und dann die IMoniker::BindToObject-Methode zu erstellen, um die Verbindung zwischen dem Client und dem Serverprozess mithilfe des neu erstellten Sitzungsmonikers zu aktivieren. An diesem Punkt können Sie den Schnittstellenzeiger verwenden, um die gewünschten Vorgänge für das Objekt auszuführen. Schließlich gibt das Beispiel den Bindungskontext frei und ruft die CoUninitialize-Funktion auf .
// 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.
Da "{class id of the class moniker}" auch eine Möglichkeit zum Benennen eines Klassenmonikers ist, können Sie die folgende Zeichenfolge verwenden, um den zusammengesetzten Moniker (den sitzungsmoniker, der mit dem Klassenmoniker zusammengesetzt wurde) anstelle der im vorherigen Beispiel gezeigten Methode zu benennen.
OLECHAR string[] =
L"Session:3!{0000031A-0000-0000-C000-000000000046}:
10000013-0000-0000-0000-000000000001";
Hinweis
Wenn derselbe Benutzer während einer sitzungsübergreifenden Aktivierung bei jeder Sitzung angemeldet ist, können Sie jeden Serverprozess, der für die Ausführung im Aktivierungsmodus "RunAs Interactive User" konfiguriert ist, erfolgreich aktivieren. Wenn unterschiedliche Benutzer bei jeder Sitzung angemeldet sind, muss der Server die CoInitializeSecurity-Funktion aufrufen, um die entsprechenden Benutzerrechte festzulegen, bevor eine erfolgreiche Aktivierung und Verbindung zwischen dem Client und dem Server erfolgen kann. Eine Möglichkeit, dies zu erreichen, besteht darin, dass der Server eine benutzerdefinierte IAccessControl-Schnittstelle implementiert und die Implementierung an CoInitializeSecurity übergibt. In jedem Fall muss der Clientbenutzer über die entsprechenden Start - und Zugriffsberechtigungen verfügen, die von der auf dem Server ausgeführten Anwendung angegeben werden. Weitere Informationen finden Sie unter Sicherheit in COM.
Weitere Informationen zu vom System bereitgestellten Monikern, Monikern und Aktivierungsmodi finden Sie unter Monikers, die IMoniker-Schnittstelle und appId Key in der COM-Dokumentation im Platform Software Development Kit (SDK).