Передача аргумента для delphi функций, загруженных через модуль ctype из динамических c библиотек ссылок (указатель на символ, дескриптор DWORD) - PullRequest
1 голос
/ 06 августа 2020

при попытке управлять внешним устройством через USB COM с помощью python, я столкнулся со следующей проблемой: фактическая функция, записанная в DLL в Delphi и загруженная в python с использованием модуля ctypes, выглядит следующим образом:

function DmxProOpen (cSerNo: pchar; var dHandle: DWORD): integer;
     stdcall; external 'DmxPro.dll';

Для этого требуется в качестве аргумента указатель на символ и 32-битный указатель на int. Итак, в Python я написал это:

SerNo = 'EN096445' #actual serial number
SerNo = ctypes.c_char_p
dLocalHandle = POINTER(c_uint32) #Local handle to pass onto the function
DLLIMPORT.DmxProOpen.argtypes = [ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint32)]
DLLIMPORT.DmxProOpen(SerNo, dLocalHandle)

, что генерирует следующую ошибку:

argument 1: <class 'TypeError'>: wrong type

Хотя я вижу, что тип соответствует требованиям. Возникает вопрос: как передать в функцию серийный номер, который был задан как «EN096445», если для нее требуется 8-битный указатель? Я попытался явно сделать переменную SerNo реальным указателем, используя указатель () с переменной, которая хранит символы, но также генерирует ошибку:

SERNO = ctypes.pointer(SerNo)
TypeError: _type_ must have storage info

он также не работал с методом byref ( ). Я также хочу спросить, есть ли способ объявить, что аргумент импортируемых функций из DLL передается по ссылке с помощью метода argtypes из ctypes. Я очень ценю любую помощь. Заранее спасибо и хорошего дня!

...