Uso di un moniker di 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 ulteriori informazioni sulla creazione di un moniker di sessione, vedere l'attivazione sessione a sessione con un moniker di sessione.
L'esempio seguente illustra come attivare un processo del server locale con l'ID classe "10000013-0000-0000-0000-0000000000001" nella sessione con l'ID sessione 3.
Prima di tutto, l'esempio chiama la funzioneCoInitialize per inizializzare la libreria COM. L'esempio chiama quindi CreateBindCtx per recuperare un puntatore a un'implementazione della 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 server, usando il moniker di sessione appena creato. A questo punto è possibile usare il puntatore all'interfaccia per eseguire le operazioni desiderate sull'oggetto . Infine, l'esempio rilascia il contesto di binding 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 di classe del moniker}" è anche un modo per nominare un moniker di classe, è possibile utilizzare la stringa seguente per nominare il moniker composito (il moniker di sessione composto con il moniker di classe) invece del modo mostrato 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 utenti diversi sono 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 personalizzata IAccessControl e passare l'implementazione a CoInitializeSecurity. In ogni caso, l'utente client deve disporre delle autorizzazioni di lancio e dei permessi di accesso specificati dall'applicazione in esecuzione sul server. Per altre informazioni, vedere Security in COM.
Per ulteriori informazioni sui moniker forniti dal sistema, sui moniker e sulle modalità di attivazione, vedere Monikers, l'interfaccia IMoniker e AppId Key nella documentazione COM del Platform Software Development Kit (SDK).