Попытка получить ответ от функции dll с помощью ctypes python

#python #ctypes

#питон #типы

Вопрос:

Я пытаюсь получить ответ из библиотеки dll на python, используя оболочку ctypes. Ответ функции должен возвращать координаты x и y в виде c_short. Соответствующий фрагмент моего кода выглядит следующим образом:

 ethdll = ctypes.cdll.LoadLibrary('C:\Users\jgallacher\Documents\Software_Drivers\RTC4eth V2 Software Release 2021-06-25\DLL\RTC4ethDLLx64.dll') def get_xy_pos(ethdll):  x = ctypes.c_short()  y = ctypes.c_short()  res = ethdll.get_xy_pos(ctypes.byref(x), ctypes.byref(y))   print(res)  

Однако, когда я пробую это определение, я получаю в качестве возврата значение Nonetype(0). Может ли кто-нибудь подсказать, что не так с моим вызовом функции? Я прикрепил

Я прикрепил картинку, показывающую тип ответа на этот вопрос.

Спасибо!

Иордания.

get_xy_pos

Комментарии:

1. Ну, это void функция — None это именно то, чего вы должны ожидать в результате. Взгляните на свои x y параметры и.

2. Привет, Джейсон, спасибо за твой ответ. Если это пустота, как я должен получить значения x и y из вызова?

3. Вы извлекаете их из параметров .

4. Не могли бы вы привести мне пример того, как я мог бы это сделать? Насколько я понимаю, мне понадобится указатель с массивом, а затем заполнить этот массив?

5. print(x.value, y.value) . Вы передаете указатели на эти параметры при вызове функции, вот что byref() происходит.

Ответ №1:

Функция возвращает void , поэтому захват возвращаемого значения ничего не делает. Вы создали x y переменные и для хранения результата и должны проверить их после вызова функции. Вот рабочий пример с примером реализации функции DLL:

тест.c

 __declspec(dllexport) void get_xy_pos(short *xpos, short *ypos) {  *xpos = 5;  *ypos = 7; }  

test.py

 import ctypes as ct  dll = ct.CDLL('./test')  # Good practice is to define .argtypes and .restype so ctypes can do type-checking dll.get_xy_pos.argtypes = ct.POINTER(ct.c_short),ct.POINTER(ct.c_short) dll.get_xy_pos.restype = None  def get_xy_pos():  x = ct.c_short() # storage for output parameters  y = ct.c_short()  dll.get_xy_pos(ct.byref(x), ct.byref(y)) # pass by reference  return x.value,y.value # inspect the return values  print(get_xy_pos())  

Выход:

 (5, 7)