Partager via


Initialisation de la bibliothèque COM

Tout programme Windows qui utilise COM doit initialiser la bibliothèque COM en appelant la fonction CoInitializeEx. Chaque thread qui utilise une interface COM doit faire un appel séparé à cette fonction. CoInitializeEx a la signature suivante :

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

Le premier paramètre est réservé et doit être NULL. Le deuxième paramètre spécifie le modèle de threading que votre programme utilisera. COM prend en charge deux modèles de threading différents, thread cloisonné et multithread. Si vous spécifiez le threading cloisonné, vous faites les garanties suivantes :

  • Vous accéderez à chaque objet COM à partir d’un seul thread ; vous ne partagerez pas de pointeurs d’interface COM entre plusieurs threads.
  • Le thread aura une boucle de messages. (Veuillez consulter la section Messages de fenêtre dans le Module 1).

Si l’une de ces contraintes n’est pas vraie, utilisez le modèle multithreaded. Pour spécifier le modèle de threading, définissez l’un des indicateurs suivants dans le paramètre dwCoInit.

Indicateur Description
COINIT_APARTMENTTHREADED Threading cloisonné.
COINIT_MULTITHREADED Multithread.

 

Vous devez définir exactement l’un de ces indicateurs. Généralement, un thread qui crée une fenêtre doit utiliser l’indicateur COINIT_APARTMENTTHREADED, et les autres threads doivent utiliser COINIT_MULTITHREADED. Cependant, certains composants COM nécessitent un modèle de threading particulier.

Remarque

En réalité, même si vous spécifiez le threading par cloisonnement, il est toujours possible de partager des interfaces entre threads en utilisant une technique appelée marshaling. Le marshaling est au-delà de la portée de ce module. Le point important est qu’avec le threading par cloisonnement, vous ne devez jamais simplement copier un pointeur d’interface vers un autre thread. Pour plus d’informations sur les modèles de threading COM, veuillez consulter la section Processus, threads et cloisonnements.

 

En plus des indicateurs déjà mentionnés, il est conseillé de définir l’indicateur COINIT_DISABLE_OLE1DDE dans le paramètre dwCoInit. Définir cet indicateur évite une certaine surcharge associée à Object Linking and Embedding (OLE) 1.0, une technologie obsolète.

Voici comment vous initialiseriez COM pour le threading par cloisonnement :

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

Le type de retour HRESULT contient un code d’erreur ou de succès. Nous aborderons la gestion des erreurs COM dans la section suivante.

Annuler l’initialisation de la bibliothèque COM

Pour chaque appel réussi à CoInitializeEx, vous devez appeler CoUninitialize avant que le thread ne se termine. Cette fonction ne prend aucun paramètre et n’a pas de valeur de retour.

CoUninitialize();

Next

Codes d’erreur dans COM