Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

Функция из dll возвращает неверные значения Python

Есть Dll(исходников нету), есть интерфейсный модуль к ней написанный на Delphi. Вызываю функцию:
function ProcessBonusListCountersPrint(vBonusCountersPrintQuery: TBonusCountersPrintQuery; var vListCountersPrint: TListCountersPrint): Integer; stdcall;
type TBonusCountersPrintQuery = packed record Card: array[0..15] of char;
type TListCountersPrint = packed record Lines: array[0..PACKET_COUNTERS_PR_MAX_LINE_COUNT - 1] of TCounterLine;
type TCounterLine = packed record LineNo: word; IsLast: byte; Num_Counter: word; N_Counter: array[0..9] of char; Value_Counter: Cardinal;
(Описание структур, функций беру из интерфейса)
На Python реализовал так:
from ctypes import *
class TBonusCountersPrintQuery(Structure): _fields_ = [("Card", c_char * 15)]
class TListCountersPrint(Structure): _fields_ = [("Lines", TCounterLine * 20)]
class TCounterLine(Structure): _fields_ = [("LineNo", c_int), ("IsLast", c_byte), ("Num_Counter", c_int), ("N_Counter", c_char * 11), ("Value_Counter", c_int)]
packet_counters_pr_max_line_count = 20; i = 0;
ProcessBonusListCountersPrint = libc.ProcessBonusListCountersPrint
ProcessBonusListCountersPrint.argtype = [TBonusCountersPrintQuery, POINTER(TListCountersPrint)] ProcessBonusListCountersPrint.restype = c_int32
vBonusCountersPrintQuery = TBonusCountersPrintQuery() vBonusCountersPrintQuery.Card = b'123456798'
vListCountersPrint = TListCountersPrint()
res = ProcessBonusListCountersPrint(vBonusCountersPrintQuery, byref(vListCountersPrint)) print('ProcessBonusListCountersPrint', res)
for i in range(packet_counters_pr_max_line_count): if vListCountersPrint.Lines[i].IsLast == 1: break print(vListCountersPrint.Lines[i].Num_Counter, vListCountersPrint.Lines[i].N_Counter.decode('cp1251'), vListCountersPrint.Lines[i].Value_Counter)
vListCountersPrint.Lines[i].N_Counter - возвращается правильное значение, а вот числовые значения из этой структуры все неверные. Числовые типы все пробовал, ни один не дал даже похожего результата. Вопрос: как получить нужные мне данные?(в среде Borland Delphi 7 все работает)


Ответ

Совместил ответ от zed и tonal. В итоге получилась такая структура:
class TCounterLine(Structure): _pack_ = 1 _fields_ = [("LineNo", c_short), ("IsLast", c_byte), ("Num_Counter", c_short), ("N_Counter", c_char * 10), ("Value_Counter", c_int)]
Всё заработало. Большое спасибо за помощь)

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

Отправить комментарий