Share via


Uso di un moniker sessione

L'attivazione da sessione a sessione consente a un processo client di attivare un processo del server locale in una sessione specificata. È possibile eseguire questa operazione in base alla sessione usando un moniker di sessione fornito dal sistema. Per altre informazioni sulla creazione di un moniker di sessione, vedere Attivazione da sessione a sessione con un moniker sessione.

Nell'esempio seguente viene illustrato come attivare un processo server locale con l'ID classe "100000013-0000-0000-00000000000000" nella sessione con l'ID sessione 3.

Prima di tutto, l'esempio chiama la funzione CoInitialize per inizializzare la libreria COM. L'esempio chiama quindi CreateBindCtx per recuperare un puntatore a un'implementazione dell'interfaccia IBindCtx . Questo oggetto archivia informazioni sulle operazioni di associazione moniker; il puntatore è necessario per chiamare i metodi dell'interfaccia IMoniker . Successivamente l'esempio chiama la funzione MkParseDisplayNameEx per creare il moniker di sessione composito e quindi il metodo IMoniker::BindToObject per attivare la connessione tra il client e il processo del server, usando il moniker sessione appena creato. A questo punto è possibile usare il puntatore dell'interfaccia per eseguire le operazioni desiderate sull'oggetto. Infine, l'esempio rilascia il contesto di associazione e chiama la funzione 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.

Poiché "{id classe del moniker}" della classe è anche un modo per assegnare un nome a un moniker di classe, è possibile usare la stringa seguente per assegnare un nome al moniker composito (il moniker di sessione composto con il moniker della classe) anziché alla modalità mostrata nell'esempio precedente.

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

Nota

Se lo stesso utente è connesso a ogni sessione durante un'attivazione tra sessioni, è possibile attivare correttamente qualsiasi processo server configurato per l'esecuzione nella modalità Di attivazione utente interattiva RunAs. Se gli utenti diversi vengono connessi a ogni sessione, il server deve chiamare la funzione CoInitializeSecurity per impostare i diritti utente appropriati prima che si verifichi un'attivazione e una connessione corretta tra il client e il server. Un modo per eseguire questa operazione consiste nell'implementare un'interfaccia IAccessControl personalizzata e passare l'implementazione a CoInitializeSecurity. In qualsiasi caso, l'utente client deve disporre delle autorizzazioni di avvio e accesso appropriate specificate dall'applicazione in esecuzione nel server. Per altre informazioni, vedere Sicurezza in COM.

 

Per altre informazioni sui moniker e i moniker e le modalità di attivazione forniti dal sistema, vedere Monikers, l'interfaccia IMoniker e AppId Key nella documentazione COM in Platform Software Development Kit (SDK).