Python 3.7-使用ctypes将参数传递给DLL

时间:2018-11-15 02:21:40

标签: python double ctypes

我有以下代码:

num1=10.1234
int1=10
ret=GetOutput(int1,num1)

函数GetOutput定义为

def GetOutput(int2, num2):
  lib = ctypes.WinDLL("mydllname.dll")
  prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_double * 4096))
  paramflags = (1, "int2",), (1, "num2",),
  GetOutput = prototype(("GetOutput", lib), paramflags)    
  ret=GetOutput(int2, num2)
  return ret

我收到以下错误,我正在请求您的帮助。

LP_c_double_Array_4096 instance instead of float

如果我将num1转换为:

num1=list(range(4096))
int1=10
ret=GetOutput(int1,num1)

我收到以下错误:

LP_c_double_Array_4096 instance instead of list

如果我将num1转换为数组,如下所示:

num1=list(range(4096))
int1=10        
for item in num1:
    arrayA = array("i", num1)
ret=GetOutput(int1,arrayA)

我遇到以下错误:

<class 'TypeError'>: expected LP_c_double_Array_4096 instance instead of array.array

请尽可能多地向我解释编程知识,并且仅对OOPS,列表,元组,指针等有非常初步的/基本的了解,而对ctypes则一无所知。

谢谢

1 个答案:

答案 0 :(得分:0)

谢谢,下面的代码可以正常工作-我在理解dll在做什么时犯了一个错误。

num2不是输入而是输出,因此paramflags将会改变。这样做可以允许对num1进行任意声明。由于参数已更改,因此调用函数Getoutput_Sub现在仅需要一个输入。以前,我通过使用相同的函数名感到困惑。

num1=10.1234
int1=10
ret=GetOutput_Main(int1,num1)

上面是调用函数的地方,下面是函数的定义方式

def GetOutput_Main(int2, num2):
    lib = ctypes.WinDLL("mydllname.dll")
    prototype=ctypes.WINFUNCTYPE(ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_double * 4096))
    paramflags = (1, "int2",), (2, "num2",),
    GetOutput_Sub = prototype(("GetOutput", lib),paramflags)    
    ret=GetOutput_Sub(int2)
    return ret

在前面的评论中,我说了两个功能和一个结构。它实际上是三个功能。我正在编写的两个文件和一个是dll标准功能的函数(在引号中传递字符串)。