2011-03-10 8 views
14

Escribí un dll de prueba en C++ para asegurarme de que todo funcionara antes de comenzar a usar un dll más importante que el que necesitaba. Básicamente se necesitan dos dobles y los agrega, luego devuelve el resultado. He estado jugando y con otras funciones de prueba he obtenido devoluciones para el trabajo, simplemente no puedo pasar un argumento debido a errores. Mi código es:Errores de argumento de Python ctypes

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 de la línea que llama "Func":

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

¿Qué estoy haciendo mal? Gracias.

Respuesta

22

Probablemente confundió las convenciones de llamadas. Supongo que tiene una función de C declara algo como esto:

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

para ello se utiliza la convención de llamada de C por defecto. El enfoque más sencillo sería cambiar la convención de llamada en el código ctypes:

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

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

double __stdcall haloshg_add(double d1, double s2) 

Hagas lo que hagas, haz solo uno de estos cambios. ¡Si haces ambas cosas, tendrás la falla inversa!

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

+0

¡Funcionó como un amuleto, gracias david por toda tu ayuda! Seleccionaré tu pregunta como la mejor tan pronto como stackoverflow me lo permita. – pajm

+0

Gracias. Estaba esperando esta, después de tu última pregunta. Esperaba que fuera así, pero es mejor en preguntas separadas. Es más ordenado de esa manera. –

+0

¡Ningún problema! Eres un salvavidas, nunca he tratado con algo como esto antes y soy nuevo con Python de todos modos ... – pajm

Cuestiones relacionadas