45
votes

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?

3
Make 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
Use 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.Eryk Sun
I 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?jeffpkamp
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 with ctypes.sizeof(ctypes.c_void_p). For the DLL you can use Dependency Walker or Visual Studio's dumpbin.Eryk Sun
Looks 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.jeffpkamp

3 Answers

50
votes

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.

2
votes

I had the same issue. I fixed by compiling my C code using the VS2015 x64 Native Tools Command Prompt. Now everything is 64bit.

-1
votes

That error can also come if you don't have all the other required dlls. Make sure you have all other .dll files that your dll depend on. As someone else pointed, Dependency Walker is a good tool.