Utilisation d’un moniker de session

L’activation de session à session permet à un processus client d’activer un processus serveur local sur une session spécifiée. Vous pouvez le faire par session à l’aide d’un moniker de session fourni par le système. Pour plus d’informations sur la création d’un moniker de session, consultez Activation de session à session avec un moniker de session.

L’exemple suivant montre comment activer un processus serveur local avec l’ID de classe « 10000013-0000-0000-0000-00000000001 » sur la session avec l’ID de session 3.

Tout d’abord, l’exemple appelle la fonction CoInitialize pour initialiser la bibliothèque COM. Ensuite, l’exemple appelle CreateBindCtx pour récupérer un pointeur vers une implémentation de l’interface IBindCtx . Cet objet stocke des informations sur les opérations de liaison moniker ; le pointeur est nécessaire pour appeler les méthodes de l’interface IMoniker . Ensuite, l’exemple appelle la fonction MkParseDisplayNameEx pour créer le moniker de session composite, puis la méthode IMoniker::BindToObject pour activer la connexion entre le client et le processus serveur, à l’aide du moniker de session nouvellement créé. À ce stade, vous pouvez utiliser le pointeur d’interface pour effectuer les opérations souhaitées sur l’objet . Enfin, l’exemple libère le contexte de liaison et appelle la fonction 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.

Étant donné que « {class id of the class moniker} » est également un moyen de nommer un moniker de classe, vous pouvez utiliser la chaîne suivante pour nommer le moniker composite (le moniker de session composé avec le moniker de classe) au lieu de la façon indiquée dans l’exemple précédent.

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

Notes

Si le même utilisateur est connecté à chaque session pendant une activation intersession, vous pouvez activer correctement n’importe quel processus serveur configuré pour s’exécuter en mode d’activation utilisateur interactif d’exécution. Si différents utilisateurs sont connectés à chaque session, le serveur doit appeler la fonction CoInitializeSecurity pour définir les droits d’utilisateur appropriés avant qu’une activation et une connexion réussies puissent se produire entre le client et le serveur. Pour ce faire, le serveur peut implémenter une interface IAccessControl personnalisée et passer l’implémentation à CoInitializeSecurity. Dans tous les cas, l’utilisateur client doit disposer des autorisations de lancement et d’accès appropriées spécifiées par l’application en cours d’exécution sur le serveur. Pour plus d’informations, consultez Sécurité dans COM.

 

Pour plus d’informations sur les monikers et les monikers fournis par le système et les modes d’activation, consultez Monikers, l’interface IMoniker et la clé AppId dans la documentation COM du Kit de développement logiciel (SDK) de plateforme.