【问题标题】:Python ctypes DLL is "not a valid Win32 application"Python ctypes DLL 是“不是有效的 Win32 应用程序”
【发布时间】: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?

标签: python ctypes


【解决方案1】:

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

nasm -f Win64 文件名.asm -o 文件名.obj

这就解决了这个问题。

【讨论】:

    【解决方案2】:

    您正在混淆 win32 和 32 位。 64 位应用程序也是 win32 应用程序。 所以你的问题与 32 位和 64 位系统无关。

    【讨论】:

    • Dietrich:导入平台; print(platform.architecture()) 并确认它是 64 位环境。 Matteo:Dependency Walker 会打开文件,所以它是一个有效的 DLL,但是 x64dbg 反汇编器说 DLL 是 32 位的,虽然它是为 64 位(NASM)编译的,并且反汇编中的所有寄存器都是 32-虽然它们是为 64 位寄存器编写的。 Mike:我认为您是对的——错误消息比特定于 32 位的更通用,所以我会调查 DLL 并在我有答案时发布。感谢你们三位的意见。
    猜你喜欢
    • 2021-02-19
    • 2022-08-10
    • 2019-08-26
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多