Error loading DLL in python, not a valid win32 application
Solution 1
As the comments suggest, it could be an architecture problem.
If you're using a 32bit DLL with 64bit Python, or vice-versa, then you'll probably get errors.
Since I've had your error before, I recommend trying to load your DLL with 32bit Python.
One way to test if a *.dll-file is 32bit or 64bit, is to use dumpbin.exe
, e.g.
dumpbin /headers dsusb.dll
...
FILE HEADER VALUES
14C machine (x86)
...
machine (x86)
means 32bit, machine (x64)
means 64bit.
Solution 2
I had the same issue. I fixed by compiling my C code using the VS2015 x64 Native Tools Command Prompt. Now everything is 64bit.
Related videos on Youtube
jeffpkamp
Updated on July 26, 2021Comments
-
jeffpkamp almost 3 years
I am trying to load a DLL in python to call functions.
import ctypes from ctypes import * dsusb = ctypes.WinDLL('c:\python27\dsusb.dll')
I get the following error in my stack.
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
I also tried cdll with the same code.
I looked up the error and windows says it's due to a path containing spaces... which I do not think is really the problem...
Am I loading this DLL wrong or is there something that might be wrong in the dll?
-
Eryk Sun over 10 yearsMake sure to match architecture -- 32-bit Python to 32-bit DLL, and so on.
WinDLL
switches to the stdcall calling convention. It should be clear from the header which convention to use. -
Eryk Sun over 10 yearsUse a raw string for the path literal;
'p'
and'd'
are ok, but you'll save yourself headaches in general. Or just use forward slashes. The Windows file API translates them to backslashes, except for long Unicode paths that use the'\\?\'
prefix. -
jeffpkamp over 10 yearsI changed the \ to /, with no change in output. I"m not sure, but I believe I am running the 32 bit of python (don't know where to check version on python). Not sure how to read DLL header... Any other ideas?
-
Eryk Sun over 10 years
platform.architecture()
returns whether the Python process is 32-bit or 64-bit, but this is just based on the pointer size, which you can do withctypes.sizeof(ctypes.c_void_p)
. For the DLL you can use Dependency Walker or Visual Studio's dumpbin. -
jeffpkamp over 10 yearsLooks like the it was due to me opening the 32bit dll with the 64bit python, you should make that an answer so I can vote for it.
-
CristiFati over 4 years
-
-
Deep Jadia almost 5 yearsHow to do that?
-
CristiFati over 3 yearsThis is incorrect. If a .dll is missing, there's a different error.