Usar un moniker de sesión
La activación de sesión a sesión permite que un proceso de cliente active un proceso de servidor local en una sesión especificada. Puede hacerlo por sesión mediante un moniker de sesión proporcionado por el sistema. Para obtener más información sobre cómo crear un moniker de sesión, consulte Activación de sesión a sesión con un moniker de sesión.
En el ejemplo siguiente se muestra cómo activar un proceso de servidor local con el identificador de clase "100000013-0000-0000-000000000001" en la sesión con el identificador de sesión 3.
En primer lugar, el ejemplo llama a la función CoInitialize para inicializar la biblioteca COM. A continuación, el ejemplo llama a CreateBindCtx para recuperar un puntero a una implementación de la interfaz IBindCtx . Este objeto almacena información sobre las operaciones de enlace de moniker; el puntero es necesario para llamar a métodos de la interfaz IMoniker . A continuación, el ejemplo llama a la función MkParseDisplayNameEx para crear el moniker de sesión compuesta y, a continuación, el método IMoniker::BindToObject para activar la conexión entre el cliente y el proceso del servidor, mediante el moniker de sesión recién creado. En este momento, puede usar el puntero de interfaz para realizar las operaciones deseadas en el objeto . Por último, el ejemplo libera el contexto de enlace y llama a la función 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.
Dado que "{class id of the class moniker}" es también una manera de asignar un nombre a un moniker de clase, puede usar la siguiente cadena para asignar un nombre al moniker compuesto (el moniker de sesión compuesto con el moniker de clase) en lugar de la forma que se muestra en el ejemplo anterior.
OLECHAR string[] =
L"Session:3!{0000031A-0000-0000-C000-000000000046}:
10000013-0000-0000-0000-000000000001";
Nota
Si el mismo usuario ha iniciado sesión en cada sesión durante una activación entre sesiones, puede activar correctamente cualquier proceso de servidor configurado para ejecutarse en el modo de activación de usuario interactivo RunAs. Si los distintos usuarios inician sesión en cada sesión, el servidor debe llamar a la función CoInitializeSecurity para establecer los derechos de usuario adecuados antes de que se produzca una activación correcta y una conexión entre el cliente y el servidor. Una manera de lograrlo sería que el servidor implemente una interfaz IAccessControl personalizada y pase la implementación a CoInitializeSecurity. En cualquier caso, el usuario cliente debe tener los permisos de inicio y acceso adecuados especificados por la aplicación que se ejecuta en el servidor. Para obtener más información, vea Seguridad en COM.
Para obtener más información sobre los monikers y los modos de activación y monikers proporcionados por el sistema, consulte Monikers, la interfaz IMoniker y appId Key en la documentación com del Kit de desarrollo de software de plataforma (SDK).