我有一个DLL来计算二次方程的根。它具有4个API,其中3个用于设置二次方程式AX^2 Bx C的系数,一个是获得根的,即:
void setA(const double a);
void setB(const double b);
void setC(const double C);
int getSolution(double *x, double *y);
我下面的Python脚本使用CTYPE来加载和测试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:WINDOWSpy.exe" test.py
1
c_float(0.0)
c_float(0.0)
请建议我在哪里出错,也建议使用此方法进行DLL的替代方法。
您需要原型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)
您也可以使用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])