Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2018 11:32:53

beardrinker
Зарегистрирован: 2018-01-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Объявить структуру ctypes при работе с delphi dll

Работаю с динамической библиотекой написанной на delphi
Есть такая структура:

 TRec1 = packed record
    Version:UInt32
end;
Prec=^TRec1
function get_version(ARec: PRec): integer;
begin
  Result := 1;
  FillChar(ARec, SizeOf(TRec1), 0);
  ARec^.Version := 2;
  Result := 0;
end;

Есть функция get_version, которая принимает указатель на эту структуру и должна вернуть ее заполненной.

Код Python:

 from ctypes import *
class TRec1(Structure):
    _pack_ = 1
    _fields_=[
            ('Version',c_uint32)           
            ]
PRec1=TRec1()
a=cdll.LoadLibrary('/home/Test_In_memmory_perfomance/lib.so')
print a.get_version(PRec1)

В итоге ф-ция возвращает ошибку, что указатель на структуру равен Null.
При попытке вызова a.get_version('str') - ф-ция отрабатывает, но стринга мне ничего не заполнит.
Правильно ли я объявил структуру?

Отредактировано beardrinker (Янв. 11, 2018 13:40:53)

Офлайн

#2 Янв. 11, 2018 14:41:51

beardrinker
Зарегистрирован: 2018-01-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Объявить структуру ctypes при работе с delphi dll

Помогло вот это:
print a.get_version(byref(PRec1)

Буду благодарен если кто-нибудь сможет объяснить почему это помогло

Офлайн

#3 Янв. 11, 2018 20:02:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объявить структуру ctypes при работе с delphi dll

beardrinker
объяснить почему это помогло
Так все и так ясно. Передача по ссылке и по значению это разные вещи.

А код выглядит странно что в питоне что в паскале. Вполне можно было обойтись передачей указателя на int32 без __pack__=1, без struct и других танцев с бубном.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version