我有一个DLL来计算二次方程的根。它有4个API,其中3个用于设置二次方程ax ^ 2 + bx + c的系数,1个用于得到根,即:
void setA(const double a);
void setB(const double b);
void setC(const double C);
int getSolution(double *x, double *y);
下面的我的Python脚本使用ctypes来加载和测试DLL。它不起作用。我为x
和y
获得了奇怪的输出。 getSolution
的结果应该为0,但我得到1表示系数A
为0。
from ctypes import *
# give location of dll
mydll = cdll.LoadLibrary("C:\\quadratic.dll")
mydll.setA(2)
mydll.setB(0)
mydll.setC(-4)
x = c_float(0)
y = c_float(0)
result = mydll.getSolution(byref(x), byref(y))
print(result)
print(x)
print(y)
我得到以下输出:
C:\>"C:\WINDOWS\py.exe" test.py
1
c_float(0.0)
c_float(0.0)
请建议我出错的地方以及此方法测试DLL的替代方法。
答案 0 :(得分:2)
您需要为ctypes原型化函数以传递正确的参数。它默认将整数传递为C int
。
from ctypes import *
mydll = CDLL("C:\\quadratic.dll")
mydll.setA.restype = None
mydll.setA.argtypes = [c_double]
mydll.setB.restype = None
mydll.setB.argtypes = [c_double]
mydll.setC.restype = None
mydll.setC.argtypes = [c_double]
mydll.getSolution.argtypes = [POINTER(c_double), POINTER(c_double)]
mydll.setA(2.0)
mydll.setB(0.0)
mydll.setC(-4.0)
x = c_double()
y = c_double()
result = mydll.getSolution(byref(x), byref(y))
print(result)
print(x.value)
print(y.value)
答案 1 :(得分:1)
您也可以使用cffi,只需复制函数原型:
from cffi import FFI
ffi = FFI()
ffi.cdef('''
void setA(const double a);
void setB(const double b);
void setC(const double C);
int getSolution(double *x, double *y);
''')
lib = ffi.dlopen("c:/quadratic.dll")
lib.setA(2)
lib.setB(0)
lib.setC(-4)
x = ffi.new("double *")
y = ffi.new("double *")
result = lib.getSolution(x, y)
print(result, x[0], y[0])