Использование во FreePascal dll для Си

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

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

UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Использование во FreePascal dll для Си

Сообщение UncleAndy »

Лет 10 назад имел хорошую практику на Delphi, но уже давно не практиковал. Так что заранее извиняюсь за возможные глупые вопросы.

Проблема такая... Есть готовая библиотека (dll, so), которую мне нужно использовать в своей программе. Но она изначально написана для использования в Си. Все декларации параметров и возвращаемых значений на Си. В гугле почему-то не нашел описания как во FreePascal использовать библиотеки написанные для Си. Может быть кто-то такое делал? Или может есть ссылки на соответствующие доки? В принципе, главная проблема - с переводом переменных и структур.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В модуле ctypes имеются сопоставления типам Си.
Если есть не понимание в конкретных параметрах, приводите их. Разжуём и поможем...
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

О! Спасибо!

На счет конкретных... Вот, например, как мне сделать аналогичное объявление своего типа по аналогии вот с этим:

typedef void CK_PTR CK_VOID_PTR;

typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;

Добавлено спустя 14 минут 57 секунд:
И еще вопрос в догонку...

Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

UncleAndy писал(а):typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;

Приведите описание функции в которой используются данные типы.
UncleAndy писал(а):Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?

Лучше в отдельном модуле.

Добавлено спустя 8 минут 14 секунд:
Я так подозреваю вида:

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

тип тра_та_та(CK_PTR* par)

?
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Mr.Smart писал(а):
UncleAndy писал(а):typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;

Приведите описание функции в которой используются данные типы.


int C_Initialize(CK_VOID_PTR);

Это примерно, т.к. в файле заголовков функции объявляются через кучу макросов.

Mr.Smart писал(а):
UncleAndy писал(а):Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?

Лучше в отдельном модуле.


Сейчас пытаюсь такое сделать. Добавил модуль, в области implementation добавил описания функций, но из соседнего модуля они не видны (в uses его прописал). Чуствую, что описания функций надо другой блок какой-то использовать, а не implementation?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А вы правильно привели описание typedef? Может там всёже

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

typedef void* CK_PTR CK_VOID_PTR;

typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;

?
Если это не так то получается бессмыслица. Зачем определять типы если они указывают на "пустоту".

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

int C_Initialize(CK_VOID_PTR);
в итоге преобразуется в
int C_Initialize(void);
а это в свою очередь соответствует
function C_Initialize: Integer; cdecl;


Добавил модуль, в области implementation добавил описания функций, но из соседнего модуля они не видны (в uses его прописал). Чуствую, что описания функций надо другой блок какой-то использовать, а не implementation?

interfece конечно.

ps А вы вообще знакомы с синтаксисом Pascal?
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

С синтаксисом знаком, но оооочень давно не использовал. Так что придется все восстанавливать. Спасибо за помощь.

Строки на Си приведены просто копированием из файла заголовка.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

Не знаю как типы, но вообще заголовочные файлы нормально переводит h2pas из FreePascal или headconv (http://www.delphi-jedi.org/api-howto.html). Потом остается только поправить пару errorов в местах где компьютер не смог разобраться.
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

h2pas попробовал - падает в процессе. :(

Добавлено спустя 14 часов 46 минут 21 секунду:
В общем, все получилось. h2pas использовал переводя файл кусками. Всем спасибо!
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Возникла проблема перевода некоторых типов с Си на Pascal.

Например, есть функция Си с аргументом типа *FILE.

Еще не уверен на счет того как можно перевести типа size_t и off_t.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

есть модуль unixtype - тип size_t там точно присутствует
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Brainenjii писал(а):есть модуль unixtype - тип size_t там точно присутствует

А его использование не повредит переносимости программы? Я ее планирую и для Linux и для Windows компилировать.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

*FILE - Pointer, как я понимаю.
size_t, off_t - ну взять, и передрать из unixtypes.h. Как я понимаю, это или Integer или Cardinal.
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Ну, с *FILE да - сам е сразу сообразил. А вот как быть с FILE если это не указатель?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

UncleAndy
size_t - это cardinal
off_t - это longint
Сишный FILE - это большая и сложная структура, т.е. набор данных, типа RECORD.
Ответить