Бинарный исполняемый файл Python с MSAA зависает при выходе

StackOverflow https://stackoverflow.com/questions/4707661

  •  11-10-2019
  •  | 
  •  

Вопрос

Я использую типы Python, чтобы получить доступ к интерфейсу IAccessible для использования MSAA (Microsoft Active Accessibility).После этого мы создаем двоичный исполняемый файл с помощью pyinstaller, поэтому проблема в том, что на конкретной платформе — Windows XP x64 наш исполняемый файл зависает при выходе.Он зависает на WaitFotMultipleObjectsEx в ole32.dll после вызова точки выхода процесса - он зависает в системном коде, а не в нашем загрузчике или даже в загрузчике pyinstaller.В ходе расследования мы обнаружили проблему — она заключается в создании множества объектов IAccessible (т.создание дочернего дерева) - если вы это сделаете, процесс зависнет.Хотите знать, сталкивался ли кто-нибудь еще с подобной проблемой?

P.S.На других ОС работает нормально.

Это было полезно?

Решение

В настоящее время я не могу четко понять основную причину этой проблемы.Но решения нашлось, даже два.

Первый:добавить дополнительный вызов функции CoUninitialize.Не знаю, почему это работает, поскольку comtypes вызывает CoUninitialize в то же время, что и CoInitialize.

Второй:изменить флаги CoInitializeEx, потому что если установлен COINIT_APARTMENTTHREADED (это значение по умолчанию в comtypes, если sys.coinit_flags не определен) - процесс зависает!Итак, я выбрал COINIT_SPEED_OVER_MEMORY, и все стало хорошо!Самый простой способ установить его — перед импортом comtypes сделать следующее:

import sys
sys.coinit_flags = 0x8 # COINIT_SPEED_OVER_MEMORY == 0x8
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top