Python ctypes argumentos de errores

Escribí una dll de prueba en C ++ para asegurarme de que las cosas funcionen antes de comenzar a usar una dll más importante que necesito. Básicamente toma dos dobles y las agrega, luego devuelve el resultado. He estado jugando y con otras funciones de prueba he conseguido que las devoluciones funcionen, simplemente no puedo pasar un argumento debido a errores. Mi código es:

import ctypes import string nDLL = ctypes.WinDLL('test.dll') func = nDLL['haloshg_add'] func.restype = ctypes.c_double func.argtypes = (ctypes.c_double,ctypes.c_double) print(func(5.0,5.0)) 

Devuelve el error para la línea que llamó “func”:

 ValueError: Procedure probably called with too many arguments (8 bytes in excess) 

¿Qué estoy haciendo mal? Gracias.

Probablemente confundiste las convenciones de llamadas. Supongo que tienes una función C declarada algo como esto:

 double haloshg_add(double d1, double s2) { return d1+d2; } 

Esto usará la convención de llamadas de C por defecto. El enfoque más simple sería cambiar la convención de llamada en su código de ctypes:

 nDLL = ctypes.CDLL('test.dll') 

Si quisiera cambiar la convención de llamada en el código C a stdcall (para que coincida con ctypes.WinDLL ), haría esto:

 double __stdcall haloshg_add(double d1, double s2) 

Hagas lo que hagas, solo haz uno de estos cambios. Si haces ambas cosas tendrás el fallo inverso!

Si fuera yo, solo cambiaría el código Python para usar la convención de llamadas C (usar CDLL ). Ese cambio tiene el menor impacto.