перевод заголовков из Си в Паскаль

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

перевод заголовков из Си в Паскаль

Сообщение Attid » 10.03.2009 15:21:59

кто сможет наглядно расказать как правельно это делается

вот есть например у меня

Код: Выделить всё

1
typedef struct LibHalContext_s LibHalContext;
typedef struct LibHalProperty_s LibHalProperty;
typedef struct LibHalPropertySet_s LibHalPropertySet;

/**
* LibHalSingletonDeviceAdded:
* @ctx: context for connection to hald
* @udi: the Unique Device Id
* @properties: the device's properties
*
* Type for callback for addon singletons when a device is added
*/
2 typedef void (*LibHalSingletonDeviceAdded) (LibHalContext *ctx,
                   const char *udi,
                   const LibHalPropertySet *properties);

/* Create a new context for a connection with hald */
3 LibHalContext *libhal_ctx_new                          (void);

/* Set DBus connection to use to talk to hald. */
4 dbus_bool_t    libhal_ctx_set_dbus_connection          (LibHalContext *ctx, DBusConnection *conn);

/* Free a LibHalContext resource */
5 dbus_bool_t    libhal_ctx_free                         (LibHalContext *ctx);


имя либы libhal

dbus_bool_t = dbus_uint32_t; описан в dbus-types.inc

цыфры я раставил чтобы показывать что откуда взял.

про 5 вроде так :

Код: Выделить всё
function libhal_ctx_free(ctx: PLibHalContext):dbus_bool_t; cdecl; external 'libhal';


про 4

Код: Выделить всё
function libhal_ctx_set_dbus_connection(ctx: PLibHalContext; conn: PDBusConnection):dbus_bool_t; cdecl; external 'libhal';


а вот 1 2 3 меня вообще смущает =/

Добавлено спустя 18 минут 46 секунд:
2
Код: Выделить всё
  LibHalSingletonDeviceAdded = procedure(ctx: PLibHalContext; const udi: PChar; const properties: PLibHalPropertySet);


Правельно ?

Добавлено спустя 11 минут 41 секунду:
3 наверно
Код: Выделить всё
function libhal_ctx_new(ctx: PLibHalContext):PLibHalContext; cdecl; external 'libhal';



осталось только 1 со свими struct =(

Добавлено спустя 32 минуты:
1 судя по всему будет так

Код: Выделить всё
  LibHalContext = record end;
  PLibHalContext = ^LibHalContext; 

  LibHalProperty = record end;
  PLibHalProperty = ^LibHalProperty; 


  LibHalPropertySet = record end;
  PLibHalPropertySet = ^LibHalPropertySet; 


хотя меня немного смущает. сейчас буду проверять на работоспособность.

Добавлено спустя 1 час 44 минуты 58 секунд:
проверил. работает. всем спасибо за внимание.

ЗЫ может удалить топик ? или потомкам оставить ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: перевод заголовков из Си в Паскаль

Сообщение B4rr4cuda » 10.03.2009 18:55:38

ггг, вот это я понимаю форумонолог. :D Оставь потомкам.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: перевод заголовков из Си в Паскаль

Сообщение Attid » 10.03.2009 20:02:21

не не все работает.

есть :

оригинал :
Код: Выделить всё
typedef void (*LibHalDeviceAdded) (LibHalContext *ctx,
               const char *udi);
/* Set the callback for when a device is added */
dbus_bool_t    libhal_ctx_set_device_added             (LibHalContext *ctx, LibHalDeviceAdded callback);


мой перевод
Код: Выделить всё
LibHalDeviceAdded = procedure(ctx: PLibHalContext; const udi: PChar);
function libhal_ctx_set_device_added(ctx: PLibHalContext;callback: LibHalDeviceAdded):dbus_bool_t; cdecl; external 'libhal';


использую :

Код: Выделить всё
procedure MyLibHalDeviceAdded(ctx: PLibHalContext; const udi: PChar);

Код: Выделить всё
  libhal_ctx_set_device_added(MyCtx, @MyLibHalDeviceAdded)



компилитмся, запускается, не получаю сигналы от HAL уже пробывал к MyLibHalDeviceAdded дописывать Register\stdcall\cdecl

не помогает. =( что забыл ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: перевод заголовков из Си в Паскаль

Сообщение Sergei I. Gorelkin » 10.03.2009 20:12:11

Attid писал(а):компилитмся, запускается, не получаю сигналы от HAL уже пробывал к MyLibHalDeviceAdded дописывать Register\stdcall\cdecl


Тип вызова не только к MyLibHalDeviceAdded дописывать надо, но и к объявлнению LibHalDeviceAdded:

Код: Выделить всё
type LibHalDeviceAdded = procedure(ctx: PLibHalContext; const udi: PChar); cdecl;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: перевод заголовков из Си в Паскаль

Сообщение Attid » 10.03.2009 20:35:20

дописывал, забыл сдесь указать. единственое что выяснил что stdcall получаю аксесс виолетион
два других не выдаю ошибки, но и работать отказываются. =(

Добавлено спустя 39 минут 42 секунды:
вроде все работает .

просто пример брал уже под питон и qt и не ожидал что у них в обертках поболее чем просто голые заголовки.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: перевод заголовков из Си в Паскаль

Сообщение Attid » 15.03.2009 11:51:11

работает но не все =(

может кто гляенет и направит меня на путь истинный

HAL хранит информацию о всех устройсвах. и может подовать сигнал о добавлении нового.

если я получаю список устройств (это список PPChar) то каждое утсройства там предстовляется строкой PChar в UTF8 (так обещают в документации) и если их печать (writeln) то получаем что-то вроде /org/freedesktop/Hal/devices/volume_uuid_49AD_075E

в LibHalDeviceAdded я должен получать тоже самое, но получаю
Код: Выделить всё
U����
     �]��E��U��\D


может где я чего потерял с кодировкой, но везде в проекте UTF8 и HAL обещает UTF8. какую кодировку можно попробывать ?

в кодах это выглядит так :
Код: Выделить всё
#137#229#131#236#24#137#93#232#137#117#236#137#69#252#137#85#248#232#249#68#1#0
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: перевод заголовков из Си в Паскаль

Сообщение скалогрыз » 15.03.2009 12:48:47

маленькая заметочка! такой код используй с осторожностью!
по следующей причине: в Си энумерации всегда 4 байта. В Паскале, по-умолчанию, они имеют различный размер (в зависимости от кол-ва элементов в энумерации, и их значений).
чтобы убедится, в том, что энумерции будут именно 4 байта, есть директива ...{$enumsize 4} или {$enumpack 4} {$packenum 4} - не помню - FPC Programmer Reference в помощь :)
Код: Выделить всё
  LibHalPropertyType =
  (
    LIBHAL_PROPERTY_TYPE_INVALID = DBUS_TYPE_INVALID, //** Used to report error condition */
    LIBHAL_PROPERTY_TYPE_INT32   = DBUS_TYPE_INT32,//** Type for 32-bit signed integer property */
    LIBHAL_PROPERTY_TYPE_UINT64  = DBUS_TYPE_UINT64,//** Type for 64-bit unsigned integer property */
    LIBHAL_PROPERTY_TYPE_DOUBLE  = DBUS_TYPE_DOUBLE,//** Type for double precision floating point property */
    LIBHAL_PROPERTY_TYPE_BOOLEAN = DBUS_TYPE_BOOLEAN,//** Type for boolean property */
    LIBHAL_PROPERTY_TYPE_STRING  = DBUS_TYPE_STRING//** Type for UTF-8 string property */
//хз    LIBHAL_PROPERTY_TYPE_STRLIST = ((int) (DBUS_TYPE_STRING<<8)+('l'))//** Type for list of UTF-8 strings property */
  );


LIBHAL_PROPERTY_TYPE_STRLIST можно представить вот так:
Код: Выделить всё
  LIBHAL_PROPERTY_TYPE_STRLIST =   (DBUS_TYPE_STRING shl 8) + (byte('l'))


ни стесняйсо использовать cdecl.

твой код:
Код: Выделить всё
type
  LibHalDeviceRemoved = procedure(ctx: PLibHalContext; const udi: PChar);

procedure MyLibHalDeviceAddedRemoved(ctx: PLibHalContext; const udi: PChar);
begin
  ...
end;

...
  if libhal_ctx_set_device_added(MyCtx, @MyLibHalDeviceAddedRemoved) = 0 then
    WriteLn('Cannot register LibHalDeviceAdded');
...


а нужно
Код: Выделить всё
type
  LibHalDeviceRemoved = procedure(ctx: PLibHalContext; const udi: PChar); cdecl;

procedure MyLibHalDeviceAddedRemoved(ctx: PLibHalContext; const udi: PChar); cdecl;
begin
  ...
end

...
  if libhal_ctx_set_device_added(MyCtx, @MyLibHalDeviceAddedRemoved) = 0 then
    WriteLn('Cannot register LibHalDeviceAdded');
...


Добавлено спустя 6 минут 29 секунд:
Код: Выделить всё
while 1 = 1 do

посмеялсо :) ничего неправильного в этом нет, просто забавно :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: перевод заголовков из Си в Паскаль

Сообщение Sergei I. Gorelkin » 15.03.2009 16:44:03

Attid писал(а):в кодах это выглядит так :
#137#229#131#236#24#137#93#232#137#117#236#137#69#252#137#85#248#232#249#68#1#0

На вид это вполне UTF-8, только начинается не с того байта. Попробуй начиная с #229 напечатать, тогда должно стать понятно, сколько первых символов потерял.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: перевод заголовков из Си в Паскаль

Сообщение Attid » 15.03.2009 17:47:36

скалогрыз писал(а):ни стесняйсо использовать cdecl.

оно :oops:

хотя я точно уверен что
Attid писал(а):компилитмся, запускается, не получаю сигналы от HAL уже пробывал к MyLibHalDeviceAdded дописывать Register\stdcall\cdecl

пробывал и не помогало. =/

соответсвенно я наверно получал указатель на случайную строку.

наверно стоит когда долго бьешься над проблемой стереть все и написать заново. спасибо за толчек в нужном направлении.

скалогрыз
я смотрю ты си читать умеешь, пойдем [code=http://freepascal.ru/forum/viewforum.php?f=20] к нам[/code] нам еще смб и ссх плагины писать, а там заголовки чет не на паскале =)

скалогрыз писал(а):while 1 = 1 do

я более страшные вещи в жизни встречал типа if 1 = 2 then . . =)

Добавлено спустя 31 минуту 21 секунду:
исправленный вариант
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: перевод заголовков из Си в Паскаль

Сообщение скалогрыз » 15.03.2009 18:27:46

компилитмся, запускается, не получаю сигналы от HAL уже пробывал к MyLibHalDeviceAdded дописывать Register\stdcall\cdecl
пробывал и не помогало. =/

скорее всего в типах ты как раз указывал cdecl, а в сових процедурах cdecl НЕ указывал... не буду спорить, ибо это уже не важно!

соответсвенно я наверно получал указатель на случайную строку.

скорее на "случайные данные", которые в твоём случае похожи на правду. так или иначе такие баги очень быстро находятся.

я смотрю ты си читать умеешь, пойдем [code=http://freepascal.ru/forum/viewforum.php?f=20] к нам[/code] нам еще смб и ссх плагины писать, а там заголовки чет не на паскале =)

спасиба за приглашение, но я пока откажусь, ибо OpenSource это хорошо, но в малых дозах. Потому что кушать тоже иногда хочется.

для конвертации смею порекомендовать:
- h2pas (тулза входит в поставку с fpc) и много что умеет, но, к сожалению не всё.
http://wiki.lazarus.freepascal.org/H2Pas
http://wiki.lazarus.freepascal.org/Crea ... _libraries
Вы (команда Double Commander-а) сами себе, и все другие в дальнейшем, будут вам благодарны за перевод страничек на русский (лично мне переводить лень... хотя можно).

- частично можно использовать objcparser: http://wiki.lazarus.freepascal.org/ObjCParser
но он пока-что заточен под objective-c и создания обёрток, хотя более тонок в настройке, да и планы на будущее есть =)
- если совсем туго, то просто выкладывай Си-шный заголовк, и помогу с конвертацией.

и ещё просьба личная... все опаскаленные заголовки передавай FPC сообществу! (добавляя в них "converted by своё гордое имя"). Тебе это откликнется обязательно ;)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru