#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). Может ли кто-нибудь подсказать, что не так с моим вызовом функции? Я прикрепил
Я прикрепил картинку, показывающую тип ответа на этот вопрос.
Спасибо!
Иордания.
Комментарии:
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)