在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应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Python Django 中加载 Mysqldb 模块时出错