Error loading DLL in python, not a valid win32 application

42,563

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.

Share:
42,563

Related videos on Youtube

jeffpkamp
Author by

jeffpkamp

Updated on July 26, 2021

Comments

  • jeffpkamp
    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
      Eryk Sun over 10 years
      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
      Eryk Sun over 10 years
      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.
    • jeffpkamp
      jeffpkamp over 10 years
      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?
    • Eryk Sun
      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 with ctypes.sizeof(ctypes.c_void_p). For the DLL you can use Dependency Walker or Visual Studio's dumpbin.
    • jeffpkamp
      jeffpkamp over 10 years
      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.
    • CristiFati
      CristiFati over 4 years
  • Deep Jadia
    Deep Jadia almost 5 years
    How to do that?
  • CristiFati
    CristiFati over 3 years
    This is incorrect. If a .dll is missing, there's a different error.