INFO : L’appel de fonctions du Shell et des Interfaces d’un multithread cloisonné

Résumé

Lorsque vous appelez ou accédez à une fonction shell ou une interface de shell à partir d’un thread qui a été initialisé comme une cloison multithread, la fonction ou l’interface peut avoir ses fonctionnalités compromies ou échouer complètement.

Plus d'informations

Un appel à CoInitializeEx(COINIT_MULTITHREADED) autorise les appels à des objets créés sur le thread appelant à être exécuté sur n’importe quel thread. Lorsque vous accédez à des objets qui utilisent le modèle cloisonné de thread dans une cloison multithread, COM synchronise l’accès à l’objet. Afin que cette synchronisation, COM doit marshaler des appels à l’objet. Car l’interpréteur de commandes ne fournit actuellement pas les informations nécessaires, via une bibliothèque de types ou le proxy/stub code, pour ses objets à être marshalés, tente d’accéder aux objets du shell à partir d’un échec de cloison multithread.


Voici quelques exemples de comment les appels vers CoInitializeEx(COINIT_MULTITHREADED) peuvent affecter les fonctions qui reposent sur des objets du shell :

GetOpenFileName/GetSaveFileName
Les utilisateurs peuvent accéder aux dossiers d’extension d’espace de noms tels que « Mes Documents » via les boîtes de dialogue Ouvrir et Enregistrer sous . Toutefois, ces dossiers inaccessible, car le navigateur ne peut pas créer les interfaces requises, par exemple IShellFolder.
ShellExecute/ShellExecuteEx
Les raccordements ShellExecute peuvent être écrit pour étendre les fonctionnalités de ShellExecute/ShellExecuteEx en implémentant l’interface IShellExecuteHook. Lorsque ShellExecute/ShellExecuteEx est appelée, des raccordements de ShellExecute ne peut pas être chargés.
Dans ces deux exemples, le composant qui tente d’obtenir un pointeur d’interface vers un objet shell avec CoCreateInstance, IUnknown::QueryInterface et ainsi de suite généralement échouera avec l’erreur E_NOINTERFACE lorsqu’elle est appelée à partir des multithreads cloisonnés. Comme indiqué ci-dessus, parce qu’il n’existe aucun type ou proxy/stub du code pour les objets demandés.

Références

« Processus », les Threads et les apartments (cloisonnés), sous COM Fundamentals de la Documentation du Platform SDK :

Propriétés

ID d'article : 287087 - Dernière mise à jour : 26 janv. 2017 - Révision : 1

Commentaires