Appel de fonctions et d’interfaces d’interpréteur de commandes à partir d’un appartement multithread

Lorsque vous appelez ou accédez à une fonction shell ou une interface shell à partir d’un thread qui a été initialisé en tant qu’appartement multithread, la fonction ou l’interface peut avoir ses fonctionnalités altérées ou complètement échouer.

Version d’origine : Interface et interpréteur de commandes Windows
Numéro de la base de connaissances d’origine : 287087

Cause

Un appel à permet d’exécuter CoInitializeEx (COINIT_MULTITHREADED) les appels aux objets créés sur le thread appelant sur n’importe quel thread. Lors de l’accès aux objets qui utilisent le modèle de thread d’appartement à partir d’un appartement multithread, COM synchronise l’accès à l’objet. Pour que cette synchronisation se produise, COM doit marshaler les appels à l’objet . Étant donné que l’interpréteur de commandes ne fournit actuellement pas les informations nécessaires, par le biais d’une bibliothèque de types ou d’un code proxy/stub, pour que ses objets soient marshalés, les tentatives d’accès aux objets shell à partir d’un appartement multithread échouent.

Appels susceptibles d’affecter les fonctions de l’interpréteur de commandes

Voici quelques exemples de la façon dont les appels à CoInitializeEx (COINIT_MULTITHREADED) peuvent affecter les fonctions qui s’appuient sur des objets shell :

  • GetOpenFileName/GetSaveFileName

    Les utilisateurs peuvent accéder aux dossiers d’extension d’espace de noms tels que Mes documents via la boîte de dialogue Ouvrir et Enregistrer sous . Toutefois, ces dossiers ne peuvent pas être parcourus, car le navigateur ne peut pas créer les interfaces requises, telles que IShellFolder.

  • ShellExecute/ShellExecuteEx

    ShellExecute Les hooks peuvent être écrits pour étendre les fonctionnalités de ShellExecute ou ShellExecuteEx en implémentant l’interface IShellExecuteHook . Quand ShellExecute ou ShellExecuteEx est appelé, les hooks inscrits ShellExecute ne peuvent 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::QueryInterfaceet ainsi de suite, échoue généralement avec une erreur E_NOINTERFACE lorsqu’il est appelé à partir d’appartements multithread. Comme indiqué ci-dessus, la raison en est qu’il n’y a pas d’informations de type ou de code proxy/stub pour les objets demandés.

References

Processus, threads et appartements