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

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

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

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

Сообщение UncleAndy » 12.07.2011 19:13:10

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

Проблема такая... Есть готовая библиотека (dll, so), которую мне нужно использовать в своей программе. Но она изначально написана для использования в Си. Все декларации параметров и возвращаемых значений на Си. В гугле почему-то не нашел описания как во FreePascal использовать библиотеки написанные для Си. Может быть кто-то такое делал? Или может есть ссылки на соответствующие доки? В принципе, главная проблема - с переводом переменных и структур.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Mr.Smart » 12.07.2011 19:39:30

В модуле ctypes имеются сопоставления типам Си.
Если есть не понимание в конкретных параметрах, приводите их. Разжуём и поможем...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение UncleAndy » 12.07.2011 19:44:57

О! Спасибо!

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

typedef void CK_PTR CK_VOID_PTR;

typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;

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

Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Mr.Smart » 12.07.2011 20:27:37

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

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

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

Добавлено спустя 8 минут 14 секунд:
Я так подозреваю вида:
Код: Выделить всё
тип тра_та_та(CK_PTR* par)

?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение UncleAndy » 12.07.2011 20:36:27

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?
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Mr.Smart » 12.07.2011 20:44:21

А вы правильно привели описание 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?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение UncleAndy » 12.07.2011 20:58:33

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

Строки на Си приведены просто копированием из файла заголовка.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение kipar » 12.07.2011 23:00:47

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

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

Сообщение UncleAndy » 12.07.2011 23:20:37

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

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

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

Сообщение UncleAndy » 16.07.2011 12:02:39

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

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

Еще не уверен на счет того как можно перевести типа size_t и off_t.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Brainenjii » 16.07.2011 19:12:53

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

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

Сообщение UncleAndy » 16.07.2011 19:27:19

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

А его использование не повредит переносимости программы? Я ее планирую и для Linux и для Windows компилировать.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение kipar » 19.07.2011 11:44:49

*FILE - Pointer, как я понимаю.
size_t, off_t - ну взять, и передрать из unixtypes.h. Как я понимаю, это или Integer или Cardinal.
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

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

Сообщение UncleAndy » 19.07.2011 12:43:55

Ну, с *FILE да - сам е сразу сообразил. А вот как быть с FILE если это не указатель?
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Vadim » 19.07.2011 13:32:24

UncleAndy
size_t - это cardinal
off_t - это longint
Сишный FILE - это большая и сложная структура, т.е. набор данных, типа RECORD.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

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

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

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

Рейтинг@Mail.ru