48

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?

jeffpkamp
  • 2,732
  • 2
  • 27
  • 51
  • 5
    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 Nov 08 '13 at 01:34
  • 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 Nov 08 '13 at 01:37
  • 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 Nov 08 '13 at 05:04
  • 2
    `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 Nov 08 '13 at 05:45
  • 1
    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 Nov 08 '13 at 17:19
  • Check [\[SO\]: Python Ctypes - loading dll throws OSError: \[WinError 193\] %1 is not a valid Win32 application (@CristiFati's answer)](https://stackoverflow.com/questions/57187566/python-ctypes-multidimensional-arrays-loading-dll-throws-oserror-winerror-1/57297745#57297745).for more details. – CristiFati Sep 26 '19 at 22:16

3 Answers3

57

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.

ead
  • 32,758
  • 6
  • 90
  • 153
ABM
  • 1,628
  • 2
  • 26
  • 42
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.

Cassio
  • 1,347
  • 13
  • 15
-2

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.

remustata
  • 69
  • 2
  • 5