Condividi tramite


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