1

我正在使用 python comtypes 来访问 IAccessible 接口以供 MSAA(Microsoft Active Accessibility)使用。之后我们使用 pyinstaller 创建二进制可执行文件,所以问题是在特定平台上 - Windows XP x64 我们的可执行文件在退出时挂起。在进程退出点被调用后,它挂在 ole32.dll 中的 WaitFotMultipleObjectsEx 上——它挂在系统代码中,而不是在我们的甚至 pyinstaller 引导加载程序中。在调查期间,我们发现了问题——它是在创建许多 IAccessible 对象(即创建子树)——如果你这样做,进程就会挂起。想知道其他人是否面临类似的问题?

PS 在其他操作系统上它工作正常。

4

1 回答 1

0

我目前无法清楚地了解此问题的根本原因。但是找到了解决方案,甚至两个。

第一:添加对 CoUninitialize 函数的额外调用。不知道为什么它会像 comtypes 一样调用 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
于 2011-01-18T15:25:53.950 回答