Python ctypes DLL是"不是有效的Win32应用程序"

时间:2017-12-28 00:27:41

标签: python ctypes

我使用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。

2 个答案:

答案 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

这解决了这个问题。