尝试将 win32ui 与 pywin32 一起使用会给出:动态 link 库 (DLL) 初始化例程失败

Trying to use win32ui with pywin32 gives: A dynamic link library (DLL) initialization routine failed

我正在尝试使用 pywin32 中的 win32ui 模块(是的,我有正确的版本)。 我的 win32gui 模块工作正常,但 ui 模块给我错误。 我已经尝试过: 正在重新安装 python, 添加 PYTHON_PATH 系统变量, 运行 安装pywin32脚本后, 至于其他的事情,我可以尝试去做。

Python 版本:3.9(64 位) Pywin32版本:pywin32-228.win-amd64-py3.9(是.exe文件名不知道怎么找版本) 只是为了清理我唯一的代码是:

import win32ui

(这是我的第一个问题所以我希望我做对了)

更新

对原始资源应用(以下)修复(以及更多),构建它们,并将 .whl 上传到 [GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/PyWin32/v228
但是,由于这个错误是一种“交易破坏者”(自 v228 发布以来已有 4+ 个月) ,我期待 v229 很快(在接下来的几天内)。

查看 (开头)的 安装步骤 部分,了解有关如何安装 .whl 的详细信息s.



它可以不断地重现于:

  • Python 3.9 64位 32 位(适用于旧版本)
  • PyWin32 228(及更早版本)
[cfati@CFATI-5510-0:e:\Work\Dev\GitHub\CristiFati\pywin32\src]> sopr.bat
*** Set shorter prompt to better fit when pasted in Whosebug (or other) pages ***

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.09.00_test0\Scripts\python.exe"
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32ui
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\Install\pc064\Python\Python.09.00\Lib\ctypes\__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] A dynamic link library (DLL) initialization routine failed
>>> import win32api

我做了一些调试(创建了一个 VStudio 2015 解决方案(有 2 个项目:Python 3.9Python 3.8) for win32ui), 结果是 Access Violation (段错误)。
“最好”的部分是它发生在之前 DllMain.

我可以让调试器进入的最后一行是 [GitHub]: mhammond/pywin32 - (b228) pywin32/Pythonwin/win32RichEdit.cpp#225:

PyCCtrlView_Type PyCRichEditView::type("PyCRichEditView", &PyCCtrlView::type, &PyCRichEditCtrl::type,
                                       RUNTIME_CLASS(CRichEditView), sizeof(PyCRichEditView),
                                       PYOBJ_OFFSET(PyCRichEditView), PyCRichEditView_methods,
                                       GET_PY_CTOR(PyCRichEditView));

这是一个静态成员。由于 2nd 和 3rd 参数也是静态成员(没有注意它们是指针的事实),我想那是[ISOCPP]: What’s the “static initialization order ‘fiasco’ (problem)”?,我追了一些鬼。

无论如何,今天我注意到 [GitHub]: mhammond/pywin32 - Ensure we hold the GIL as win32ui initializes and calls back into Python (and from there [GitHub]: mhammond/pywin32 - Import win32ui broken on Python 3.9 它正在寻址)。

应用补丁,解决问题:

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.09.00_test0\Scripts\python.exe"
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32ui
>>> import win32api