Python 3.7 - передача параметров в DLL с использованием ctypes - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующий код:

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 голосов
/ 16 ноября 2018

Спасибо всем, следующий код работает - я ошибся в понимании того, что делает dll.

num2 - это не вход, а выход, и, следовательно, параметры могут измениться.Это позволяет любое произвольное объявление 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.

...