在python中加载DLL时出错,不是有效的win32应用程序[重复]

Posted

技术标签:

【中文标题】在python中加载DLL时出错,不是有效的win32应用程序[重复]【英文标题】:Error loading DLL in python, not a valid win32 application [duplicate] 【发布时间】:2013-11-19 20:58:21 【问题描述】:

我正在尝试在 python 中加载一个 DLL 来调用函数。

import ctypes
from ctypes import *

dsusb = ctypes.WinDLL('c:\python27\dsusb.dll')

我的堆栈中出现以下错误。

C:\Python27>python test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    dsusb = ctypes.WinDLL('c:\python27\dsusb.dll')
  File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 is not a valid Win32 application

我也用相同的代码尝试了 cdll。

我查看了错误,windows 说这是由于路径包含空格...我认为这不是真正的问题...

是我加载此 DLL 错误还是 dll 中可能有问题?

【问题讨论】:

确保架构匹配——32 位 Python 到 32 位 DLL,等等。 WinDLL 切换到 stdcall 调用约定。从标题中应该清楚使用哪种约定。 使用原始字符串作为路径文字; 'p''d' 没问题,但一般来说你会省去头痛。或者只使用正斜杠。 Windows 文件 API 将它们转换为反斜杠,但使用 '\\?\' 前缀的长 Unicode 路径除外。 我将 \ 更改为 /,但输出没有变化。我不确定,但我相信我正在运行 32 位的 python(不知道在哪里检查 python 的版本)。不知道如何读取 DLL 头......还有其他想法吗? platform.architecture() 返回 Python 进程是 32 位还是 64 位,但这只是基于指针大小,您可以使用 ctypes.sizeof(ctypes.c_void_p) 来完成。对于 DLL,您可以使用 Dependency Walker 或 Visual Studio 的 dumpbin。 看起来是因为我用 64 位 python 打开了 32 位 dll,你应该给出答案,这样我就可以投票了。 【参考方案1】:

正如 cmets 所暗示的,这可能是架构问题。

如果您在 64 位 Python 中使用 32 位 DLL,反之亦然,那么您可能会遇到错误。

由于我之前遇到过您的错误,我建议您尝试使用 32 位 Python 加载您的 DLL。

测试 *.dll 文件是 32 位还是 64 位的一种方法是使用 dumpbin.exe,例如

dumpbin /headers dsusb.dll

...

FILE HEADER VALUES
             14C machine (x86)
...

machine (x86) 表示 32 位,machine (x64) 表示 64 位。

【讨论】:

【参考方案2】:

我有同样的问题。我通过使用 VS2015 x64 本机工具命令提示符编译我的 C 代码来修复。现在一切都是 64 位的。

【讨论】:

怎么做?【参考方案3】:

如果您没有所有其他必需的 dll,也会出现该错误。确保您拥有您的 dll 所依赖的所有其他 .dll 文件。正如其他人指出的那样,Dependency Walker 是一个很好的工具。

【讨论】:

这是不正确的。如果缺少 .dll,则会出现不同的错误。

以上是关于在python中加载DLL时出错,不是有效的win32应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Azure Functions中加载第三方DLL

在 Python Django 中加载 Mysqldb 模块时出错

在 Visual Studio c++ 中创建将在 VB 中加载的 DLL

无法在 python 中加载 c++ DLL

使用 JS 在 MVC 中加载部分视图时出错

无法在 python (3.4) 中加载 dll 文件