2014-01-28 26 views
0

我有一个DLL来计算二次方程的根。它有4层的API,其中3个是用于设置二次方程AX^2 + BX + C的系数,一个得到的根源,即:Python脚本通过导入它来测试DLL的功能

void setA(const double a); 
void setB(const double b); 
void setC(const double C); 
int getSolution(double *x, double *y); 

我的Python脚本下面使用ctypes的加载和测试DLL。它不工作。我得到奇怪的输出为xy。的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

Windows目录应该在你的PATH,加上.py文件扩展名应该与py.exe相关。所以你应该能够直接执行'test.py'。假设你已经安装了其他版本,你可以在第一行添加一个shebang,比如'#!python3',以确保它在3.x中运行。 – eryksun

回答

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

您也可以使用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])