我使用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。
答案 0 :(得分:0)
你正在混合win32和32位。 64位应用程序也是win32应用程序。 所以你的问题与32位和64位系统无关。
答案 1 :(得分:0)
我解决了这个问题。在链接之前,我用NASM汇编程序组装了这个DLL。最初,我使用-f COFF作为输出格式。但是,当您使用NASM为64位进行汇编时,必须使用-f Win64作为输出格式,而不是-f COFF。所以正确的输出格式(没有其他开关)是:
nasm -f Win64 FileName.asm -o FileName.obj
这解决了这个问题。