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 deShellExecute
ouShellExecuteEx
en implémentant l’interfaceIShellExecuteHook
. QuandShellExecute
ouShellExecuteEx
est appelé, les hooks inscritsShellExecute
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::QueryInterface
et 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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour