无法使用ctypes将参数传递给dll(Python)

时间:2012-04-06 10:19:55

标签: python dll ctypes

使用ctypes时遇到一些问题

我有一个带有以下界面的testdll

extern "C"
{
    // Returns a + b
    double Add(double a, double b);
    // Returns a - b
    double Subtract(double a, double b);
    // Returns a * b
    double Multiply(double a, double b);
    // Returns a / b
    double Divide(double a, double b);
}

我还有一个.def文件,所以我有“真正的”名字

LIBRARY "MathFuncsDll"
EXPORTS

 Add
 Subtract
 Multiply
 Divide

我可以通过ctype从dll加载和访问该函数 但我无法传递参数,请参阅python输出

>>> from ctypes import *
>>> x=windll.MathFuncsDll
>>> x
<WinDLL 'MathFuncsDll', handle 560000 at 29e1710>
>>> a=c_double(2.12)
>>> b=c_double(3.4432)
>>> x.Add(a,b)

Traceback (most recent call last):
  File "<pyshell#76>", line 1, in <module>
    x.Add(a,b)
ValueError: Procedure probably called with too many arguments (16 bytes in excess)
>>> 

但我可以在没有参数的情况下添加功能吗?!?!?!?!

>>> x.Add()
2619260

有人能指出我正确的方向吗? 我想忘记一些明显的东西,因为我可以从其他DLL调用函数(例如kernel32)

1 个答案:

答案 0 :(得分:7)

除非您另行指定,否则

ctypes会为参数设置intpointer类型,为返回值设置int。导出的函数通常也默认为C调用约定(ctypes中的CDLL),而不是WinDLL。试试这个:

from ctypes import *
x = CDLL('MathFuncsDll')
add = x.Add
add.restype = c_double
add.argtypes = [c_double,c_double]
print add(1.0,2.5)

输出

3.5