Compartilhar via


Usando um Moniker de Sessão

A ativação de sessão para sessão permite que um processo de cliente ative um processo de servidor local em uma sessão especificada. Você pode fazer isso por sessão usando um moniker de sessão fornecido pelo sistema. Para obter mais informações sobre como criar um moniker de sessão, consulte Ativação de sessão para sessão com um moniker de sessão.

O exemplo a seguir mostra como ativar um processo de servidor local com a ID de classe "10000013-0000-0000-0000-000000000001" na sessão com a ID da sessão 3.

Primeiro, o exemplo chama a função CoInitialize para inicializar a biblioteca COM. Em seguida, o exemplo chama CreateBindCtx para recuperar um ponteiro para uma implementação da interface IBindCtx . Esse objeto armazena informações sobre operações de associação de moniker; o ponteiro é necessário para chamar métodos da interface IMoniker . Em seguida, o exemplo chama a função MkParseDisplayNameEx para criar o moniker de sessão composta e, em seguida, o método IMoniker::BindToObject para ativar a conexão entre o cliente e o processo do servidor, usando o moniker de sessão recém-criado. Neste ponto, você pode usar o ponteiro de interface para executar as operações desejadas no objeto . Por fim, o exemplo libera o contexto de associação e chama a função 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.

Como "{id de classe do moniker de classe}" também é uma maneira de nomear um moniker de classe, você pode usar a cadeia de caracteres a seguir para nomear o moniker composto (o moniker de sessão composto com o moniker de classe) em vez da maneira mostrada no exemplo anterior.

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

Observação

Se o mesmo usuário estiver conectado a cada sessão durante uma ativação entre sessões, você poderá ativar com êxito qualquer processo de servidor configurado para ser executado no modo de ativação Executar como Usuário Interativo. Se diferentes usuários estiverem conectados a cada sessão, o servidor deverá chamar a função CoInitializeSecurity para definir os direitos de usuário apropriados antes que uma ativação e conexão bem-sucedidas possam ocorrer entre o cliente e o servidor. Uma maneira de fazer isso seria o servidor implementar uma interface IAccessControl personalizada e passar a implementação para CoInitializeSecurity. De qualquer forma, o usuário cliente deve ter as Permissões de Inicialização e Acesso apropriadas especificadas pelo aplicativo em execução no servidor. Para obter mais informações, consulte Segurança em COM.

 

Para obter mais informações sobre monikers fornecidos pelo sistema e monikers e modos de ativação, consulte Monikers, a interface IMoniker e AppId Key na documentação COM no SDK (Platform Software Development Kit).