Взаимодействие с Си: коллбэк с переменным числом аргументов

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

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

Ответить
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Взаимодействие с Си: коллбэк с переменным числом аргументов

Сообщение Иван Шихалев »

Такой вопрос — внешняя функция в C-библиотеке принимает в качестве параметра такое:

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

VALUE (*bl_proc) (...)


Перевести это в тип не проблема:

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

F_bl_proc = function : VALUE; cdecl; varargs;

или

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

F_bl_proc = function (args : array of const) : VALUE; cdecl;


Вопрос в том, можно ли как-то написать на паскале функцию, удовлетворяющую этим типам? Или вообще, такую, которую можно подставить в качестве коллбэка в этом случае (независимо от контроля типов)?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Реализация на Паскале cdecl - функций с переменным числом параметров намеренно не поддерживается.

Подставить же можно вообще любую функцию, лишь бы она была объявлена как cdecl - стек останется сбалансированным. Но достучаться до параметров без ассемблера будет тяжело.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Т.е. если я в конкретном случае знаю, сколько параметров будет передано, то могу смело объявлять функцию с ними и она обработается? Вот в данном случае имеется:

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

function rb_block_call (obj : VALUE; mid : ID; argc : cint; argv : PVALUE;
  bl_proc : F_bl_proc; data2 : VALUE) : VALUE; cdecl; external RUBYLIB;

Т.е. вызывается некий метод, которому передается блок кода, собственно, с какими параметрами он будет внутри вызыван, практически однозначно определяется методом, т.е. параметрами obj и mid...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Как всегда, такой финт сработает только для i386. На остальных платформах возможны нюансы, нужно изучать ABI.
Ответить