Partager via


Création de la table d’interface globale

Utilisez l’appel suivant pour créer l’objet table d’interface globale et obtenir un pointeur vers IGlobalInterfaceTable :

HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
                 NULL,
                 CLSCTX_INPROC_SERVER,
                 IID_IGlobalInterfaceTable,
                 (void **)&gpGIT);
if (hr != S_OK) {
  exit(0); // Handle errors here.
}

Notes

Lors de la création de l’objet de table d’interface globale à l’aide de l’appel précédent, il est nécessaire de lier à la bibliothèque uuid.lib. Cela permet de résoudre les symboles externes CLSID_StdGlobalInterfaceTable et IID_IGlobalInterfaceTable.

 

Il existe une seule instance de la table d’interface globale par processus, de sorte que tous les appels à cette fonction dans un processus retournent le même instance.

Après l’appel à la fonction CoCreateInstance , inscrivez l’interface à partir de l’appartement dans lequel elle réside avec un appel à la méthode RegisterInterfaceInGlobal . Cette méthode fournit un cookie qui identifie l’interface et son emplacement. Un appartement recherchant un pointeur vers cette interface appelle ensuite la méthode GetInterfaceFromGlobal avec ce cookie, puis l’implémentation fournit un pointeur d’interface vers l’appartement appelant. Pour révoquer l’inscription globale de l’interface, n’importe quel appartement peut appeler la méthode RevokeInterfaceFromGlobal .

Un exemple simple d’utilisation d’IGlobalInterfaceTable est lorsque vous souhaitez passer un pointeur d’interface sur un objet dans un appartement à thread unique (STA) à un thread de travail dans un autre appartement. Au lieu d’avoir à le marshaler dans un flux et à le transmettre au thread de travail en tant que paramètre de thread, IGlobalInterfaceTable vous permet simplement de passer un cookie.

Lorsque vous inscrivez l’interface dans la table d’interface globale, vous obtenez un cookie que vous pouvez utiliser au lieu de passer le pointeur réel (chaque fois que vous devez passer le pointeur), soit à un paramètre non défini qui va à un autre appartement (en tant que paramètre à ThreadProc via CreateThread) ou à la mémoire in-process accessible en dehors de votre appartement.

Il faut faire attention, car l’utilisation d’interfaces globales charge le programmeur de gérer des problèmes tels que les conditions de concurrence et l’exclusion mutuelle, qui sont associés à l’accès simultané à l’état global à partir de plusieurs threads.

COM fournit une implémentation standard de l’interface IGlobalInterfaceTable . Il est vivement recommandé d’utiliser cette implémentation standard, car elle fournit des fonctionnalités thread-safe complètes.

Quand utiliser la table d’interface globale