Python exécutable binaire avec MSAA se bloque à la sortie
-
11-10-2019 - |
Question
J'utilise comtypes python pour avoir accès à l'interface IAccessible pour l'utilisation MSAA (Microsoft Active Accessibility). Après cela, nous créons exécutable binaire en utilisant pyinstaller, de sorte que le problème est que sur la plate-forme spécifique - Windows XP x64 nos exécutables bloque la sortie. Il se bloque sur WaitFotMultipleObjectsEx dans ole32.dll après le point de sortie du processus est appelé - il se bloque dans le code du système pas dans notre, ou même pyinstaller chargeur de démarrage. Au cours de l'enquête nous avons trouvé le problème - il est dans la création de nombreux objets IAccessible (à savoir la création de l'arbre de l'enfant) - si vous le faites Proccess se bloque. Vous voulez savoir si quelqu'un d'autre face problème similaire?
P.S. Sur d'autres systèmes d'exploitation, il fonctionne très bien.
La solution
Je ne suis pas en mesure de comprendre clairement la raison fondamentale de cette question actuellement. Mais on a trouvé la solution, même deux.
Tout d'abord: pour ajouter un appel supplémentaire à la fonction CoUninitialize. Je ne sais pas pourquoi cela fonctionne comme les appels comtypes CoUnInitialize les mêmes moments que CoInitialize.
Deuxième: changer les drapeaux CoInitializeEx, parce que si COINIT_APARTMENTTHREADED est réglé (il est la valeur par défaut dans comtypes si sys.coinit_flags n'est pas défini) - processus se bloque! Donc, j'ai choisi COINIT_SPEED_OVER_MEMORY et tout est devenu bien! La meilleure façon de le régler est de faire ce qui suit avant comtypes importation:
import sys
sys.coinit_flags = 0x8 # COINIT_SPEED_OVER_MEMORY == 0x8