【发布时间】:2017-12-28 00:27:41
【问题描述】:
我正在使用 ctypes 将 64 位 Windows DLL 加载到 64 位 Python 3.6.2 环境中,但 Python 抱怨 DLL 不是 32 位 DLL。这都是 64 位的,所以我不知道为什么它需要一个 32 位的 DLL。 Visual Studio 2017 和 PyCharm 2017.1.5 中也会出现同样的错误消息。
问题代码如下:
ThisDLL = ctypes.WinDLL(r"C:\Temp2\Test_Project\Std_Math_Formulas.dll")
以下是错误消息:
File "C:\Project Backups\Python Projects - PyCharm\Test_DLL\Main_Entry.py", line 73, in CTypes_Test_02
ThisDLL = ctypes.WinDLL(r"C:\Temp2\Test_Project\Std_Math_Formulas.dll")
File "C:\Program Files\Python36\lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
我对此进行了详细研究,答案都适用于 32 位到 64 位的混合情况——64 位环境中的 32 位 DLL 或 32 位环境中的 64 位 DLL。在这里,它们的环境和 DLL 都是 64 位的。
我知道 Windows 32 位 DLL 使用 stdcall 调用约定,而 64 位使用 fastcall 约定,但 ctypes 应该能够加载 64 位 DLL。
【问题讨论】:
-
你怎么知道你的 Python 环境是 64 位的?你能打印
import platform; print(platform.architecture())的输出吗? -
我不完全确定,但我不会对 Windows 错误 193 不是“位本地化”感到惊讶 - 即,这是一个通用加载程序错误,并且会吐出“它不是一个有效的 Win32 应用程序”来回复一个无效的文件,不管它需要 32 位或 64 位可执行文件。如果您在例如打开该 dll Dependency Walker 是否将其视为有效的 dll?