Python ctypes DLL 是 "not a valid Win32 application"
Python ctypes DLL is "not a valid Win32 application"
我正在使用 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 位的。
我知道Windows32 位 DLL 使用 stdcall 调用约定,64 位使用 fastcall 约定,但 ctypes 应该能够加载 64 位 DLL。
您混淆了 win32 和 32 位。
64 位应用程序也是 win32 应用程序。
所以你的问题与32位和64位系统无关
我解决了这个问题。在链接之前,我用 NASM assembler assembled 这个 DLL。最初,我使用 -f COFF 作为输出格式。但是,当您 assemble 和 NASM 用于 64 位时,您必须使用 -f Win64 作为输出格式,而不是 -f COFF。所以正确的输出格式(没有其他开关)是:
nasm -f Win64 FileName.asm -o FileName.obj
这就解决了这个问题。
我正在使用 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 位的。
我知道Windows32 位 DLL 使用 stdcall 调用约定,64 位使用 fastcall 约定,但 ctypes 应该能够加载 64 位 DLL。
您混淆了 win32 和 32 位。 64 位应用程序也是 win32 应用程序。 所以你的问题与32位和64位系统无关
我解决了这个问题。在链接之前,我用 NASM assembler assembled 这个 DLL。最初,我使用 -f COFF 作为输出格式。但是,当您 assemble 和 NASM 用于 64 位时,您必须使用 -f Win64 作为输出格式,而不是 -f COFF。所以正确的输出格式(没有其他开关)是:
nasm -f Win64 FileName.asm -o FileName.obj
这就解决了这个问题。