我正在使用python comtypes来访问用于MSAA(Microsoft Active Accessibility)用法的IAccessible接口。之后我们使用pyinstaller创建二进制可执行文件,所以问题是在特定平台上 - Windows XP x64我们的可执行文件在退出时挂起。在调用进程退出点之后,它挂起在ole32.dll中的WaitFotMultipleObjectsEx上 - 它挂起的系统代码不在我们的甚至是pyinstaller引导加载程序中。在调查期间,我们找到了问题 - 它是在创建许多IAccessible对象(即创建子树) - 如果你这样做,proccess就会挂起。想知道其他人是否遇到类似的问题?
P.S。在其他操作系统上它工作正常。
答案 0 :(得分:0)
我目前无法清楚地了解此问题的根本原因。但是找到了解决方案,甚至两个。
首先:添加对CoUninitialize函数的附加调用。 不知道为什么它的工作原理,因为Cotyin调用CoUninitialize与CoInitialize相同。
第二:更改CoInitializeEx标志,如果设置了COINIT_APARTMENTTHREADED(如果未定义sys.coinit_flags,则为comtypes中的默认值) - 进程挂起!所以我选择了COINIT_SPEED_OVER_MEMORY,一切都变好了!设置它的最简单方法是在导入comtypes之前执行以下操作:
import sys
sys.coinit_flags = 0x8 # COINIT_SPEED_OVER_MEMORY == 0x8