ctypes application win32 non valide

WindowsError: [WinError 193] %1 n’est pas une application Win32 valide

a marqué ce sujet comme résolu.

Bonsoir, J’ai besoin d’executer une fonction c dans un code python. J’ai donc fait un simple essai avec :

function.c

int myfunc(int x) {
    return x*10;
}

main.py

import ctypes
fun = ctypes.CDLL("mylib.dll")
fun.myfunction.argtypes(ctypes.c_int)

puis je compile function.c : gcc -shared -o mylib.dll function.c

mais problème, windows ne semble pas reconnaitre mon dll, l’erreur en executant main.py :

Traceback (most recent call last):
  File "C:/Users/Coco/Documents/-Nicolas/prog/python/__Tests/Cfunc/main.py", line 3, in <module>
    fun = ctypes.CDLL("mylib.dll")
  File "C:\Program Files\Python38\lib\ctypes\__init__.py", line 369, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 n’est pas une application Win32 valide

j’ai tenté de compiler avec l’option -m32, même resultat.

pour info, je suis sous windows 7, 64 bit.
la version de mon compilateur :

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/8.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-8.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --prefix=/mingw --disable-win32-registry --wit
h-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-8.2.0-3' --with-gmp=/mingw --with-m
pfr=/mingw --with-mpc=/mingw --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtim
e-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-isl=/mingw --enable-libgomp --disable-libvtv --enabl
e-nls --disable-build-format-warnings
Thread model: win32
gcc version 8.2.0 (MinGW.org GCC-8.2.0-3)

Si vous avez une explication je suis preneur, merci d’avance .

+0 -0

Salut,

Ca sent le problème de 32 vs 64 bits à plein nez. Soit python est en 64 bits et ta DLL en 32, soit l’inverse.

Pour que ça marche il faut que python et la DLL soit les deux en 32, ou les deux en 64 bits.

Un programme 64 bits ne peut pas charger une DLL 32 bits, contrairement à ce qu’on croit… si tu n’as pas d’autre choix, l’astuce couramment utilisée est de faire un programme qui sert de proxy, en communiquant avec lui par des techniques d’IPC (pipe, socket, etc.)

Une autre petite chose: pour que ta fonction soit effectivement exportée et disponible dans la DLl, il faudra peut-être ajouter __declspec(dllexport). IL existe des programmes pour vérifier quelles sont les symboles exportés.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte