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

Python ctypes DLL是;不是有效的Win32应用程序;,python,ctypes,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:\Proje

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

您将win32和32位DLL混为一谈。 64位应用程序也是win32应用程序。
因此,您的问题与32位和64位系统无关。

我解决了这个问题。在链接之前,我用NASM汇编程序组装了这个DLL。最初,我使用-f COFF作为输出格式。但是,当您使用NASM汇编64位时,必须使用-f Win64作为输出格式,而不是-f COFF。因此,正确的输出格式(无其他开关)为:

nasm-f Win64 FileName.asm-o FileName.obj


这就解决了这个问题

您如何知道您的Python环境是64位的?是否可以打印导入平台的
输出;print(platform.architecture())
?我不完全确定,但Windows错误193不是“位本地化”的,也就是说,它是一个通用加载程序错误,并且会在回复无效文件时吐出“它不是有效的Win32应用程序”,而不管它是否需要32位或64位可执行文件。如果在Dependency Walker中打开该dll,它是否将其视为有效的dll?Dietrich:import platform;打印(platform.architecture())并确认它是一个64位环境。Matteo:Dependency Walker将打开该文件,因此它是一个有效的DLL,但x64dbg反汇编程序说该DLL是32位的,尽管它是为64位(NASM)编译的,反汇编中的所有寄存器都是32位的,尽管它们是为64位寄存器编写的。迈克:我想你是对的——错误信息更一般,而不是特定于32位的,所以我会调查DLL并在得到答案后发布。感谢你们三位的投入。