Использование во FreePascal dll для Си
Модератор: Модераторы
Использование во FreePascal dll для Си
Лет 10 назад имел хорошую практику на Delphi, но уже давно не практиковал. Так что заранее извиняюсь за возможные глупые вопросы.
Проблема такая... Есть готовая библиотека (dll, so), которую мне нужно использовать в своей программе. Но она изначально написана для использования в Си. Все декларации параметров и возвращаемых значений на Си. В гугле почему-то не нашел описания как во FreePascal использовать библиотеки написанные для Си. Может быть кто-то такое делал? Или может есть ссылки на соответствующие доки? В принципе, главная проблема - с переводом переменных и структур.
Проблема такая... Есть готовая библиотека (dll, so), которую мне нужно использовать в своей программе. Но она изначально написана для использования в Си. Все декларации параметров и возвращаемых значений на Си. В гугле почему-то не нашел описания как во FreePascal использовать библиотеки написанные для Си. Может быть кто-то такое делал? Или может есть ссылки на соответствующие доки? В принципе, главная проблема - с переводом переменных и структур.
В модуле ctypes имеются сопоставления типам Си.
Если есть не понимание в конкретных параметрах, приводите их. Разжуём и поможем...
Если есть не понимание в конкретных параметрах, приводите их. Разжуём и поможем...
О! Спасибо!
На счет конкретных... Вот, например, как мне сделать аналогичное объявление своего типа по аналогии вот с этим:
typedef void CK_PTR CK_VOID_PTR;
typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;
Добавлено спустя 14 минут 57 секунд:
И еще вопрос в догонку...
Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?
На счет конкретных... Вот, например, как мне сделать аналогичное объявление своего типа по аналогии вот с этим:
typedef void CK_PTR CK_VOID_PTR;
typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;
Добавлено спустя 14 минут 57 секунд:
И еще вопрос в догонку...
Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?
UncleAndy писал(а):typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR;
Приведите описание функции в которой используются данные типы.
UncleAndy писал(а):Как лучше оформить все эти описания функций и типов? В виде юнита? Его можно будет подключить к другим проектам в случае необходимости? Или лучше как-то по другому?
Лучше в отдельном модуле.
Добавлено спустя 8 минут 14 секунд:
Я так подозреваю вида:
Код: Выделить всё
тип тра_та_та(CK_PTR* par)?
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?
А вы правильно привели описание typedef? Может там всёже
?
Если это не так то получается бессмыслица. Зачем определять типы если они указывают на "пустоту".
interfece конечно.
ps А вы вообще знакомы с синтаксисом Pascal?
Код: Выделить всё
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?
С синтаксисом знаком, но оооочень давно не использовал. Так что придется все восстанавливать. Спасибо за помощь.
Строки на Си приведены просто копированием из файла заголовка.
Строки на Си приведены просто копированием из файла заголовка.
Не знаю как типы, но вообще заголовочные файлы нормально переводит h2pas из FreePascal или headconv (http://www.delphi-jedi.org/api-howto.html). Потом остается только поправить пару errorов в местах где компьютер не смог разобраться.
h2pas попробовал - падает в процессе. 
Добавлено спустя 14 часов 46 минут 21 секунду:
В общем, все получилось. h2pas использовал переводя файл кусками. Всем спасибо!
Добавлено спустя 14 часов 46 минут 21 секунду:
В общем, все получилось. h2pas использовал переводя файл кусками. Всем спасибо!
Возникла проблема перевода некоторых типов с Си на Pascal.
Например, есть функция Си с аргументом типа *FILE.
Еще не уверен на счет того как можно перевести типа size_t и off_t.
Например, есть функция Си с аргументом типа *FILE.
Еще не уверен на счет того как можно перевести типа size_t и off_t.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
есть модуль unixtype - тип size_t там точно присутствует
Brainenjii писал(а):есть модуль unixtype - тип size_t там точно присутствует
А его использование не повредит переносимости программы? Я ее планирую и для Linux и для Windows компилировать.
*FILE - Pointer, как я понимаю.
size_t, off_t - ну взять, и передрать из unixtypes.h. Как я понимаю, это или Integer или Cardinal.
size_t, off_t - ну взять, и передрать из unixtypes.h. Как я понимаю, это или Integer или Cardinal.
Ну, с *FILE да - сам е сразу сообразил. А вот как быть с FILE если это не указатель?
UncleAndy
size_t - это cardinal
off_t - это longint
Сишный FILE - это большая и сложная структура, т.е. набор данных, типа RECORD.
size_t - это cardinal
off_t - это longint
Сишный FILE - это большая и сложная структура, т.е. набор данных, типа RECORD.
