Delphi 4: varargs - как?

Bird_V

Есть такая библиотека - libcurl. К ней есть обёртка для дельфи/FPC - CurlPas. Так как libcurl изначально C-шный, то активно использует функции с переменным числом аргументов. Упомянутая обёртка использует ключевое слово varargs, появившееся в 7й (?) версии дельфей, а работа ведётся с 4-й версией (и поменять никак нельзя).
Вопрос в следующем: как в 4-х дельфях корректно обернуть вызов C-функций c переменным числом аргументов?

Serab

Первое, что приходит в голову: написать сишную обертку с постоянным числом аргументов и вызывать из Delphi уже ее :grin:

Corrector

Проще всего наверно действительно сделать обертку, в 7 дельфи или си.
Можно также обойтись без обертки, а записать принудительно в стэк массив varagrs перед вызовом функции.

Serab

принудительно в стэк массив varagrs перед вызовом функции.
А ты знаешь все требования cdecl-соглашения по вызову функций?
Я как бэ к тому, что удалять тоже самому придется.

kill-still

появившееся в 7й (?) версии дельфей
6ой вроде.
а есть доступ к обёртке этой? можно бы было переписать и вызывать с одним параметром (указатель) и дальше творить что вздумается.

Bird_V

К обёртке доступ есть, libcurl трогать бы не хотелось.
Пока ждал ответов, ещё раз перелопатил код обёртки, и обнаружил, что везде varargs используется для передачи одного параметра произвольного типа. Собственно вопрос теперь формулируется так: как передать в cdecl-функцию один аргумент произвольного типа?

kill-still

Что тебе мешает сделать из этого DLL, скомпилить под семёркой и вывести наружу необходимые функции, раз уж тебе так нужна эта библиотека.

vall

на ассемблере напиши

Bird_V

Таки видимо придётся на ассемблере делать.

Serab

да почему?

Andbar

Собственно вопрос теперь формулируется так: как передать в cdecl-функцию один аргумент произвольного типа?
procedure foo(var x);cdecl;?
Или нужно не указатель?

Serab

А ты уверен, что это совместимо с void f(...)?

Andbar

А ты уверен, что это совместимо с void f(...)?
Конкретно указанная декларация - это void foo(void *x);
Если один аргумент - указатель, то должно быть совместимо. Иначе нужно обёртку делать, либо прописывать несколько одинаковых деклараций, по одной для каждого используемого типа.

Serab

о, прикольно, и правда. Т.е. на самом деле можно практически любую сигнатуру вписать вместо (...)

Bird_V

Поковырявшись в файлах, приложенных к обёртке, обнаружил bash-скрипт, конвертирующий curl.h в pas. При вдумчивом изучение этого скрипта обнаружилось следующее:

if [ "$FPC_HAS_VARARGS" = "yes" ]
then
awk '{
sub(/; args:array of const/, "");
sub(/ cdecl;/, " varargs; cdecl;"); print }'
else
awk '{
sub(/; args:array of const/, "{$IFDEF FPC}; args:array of const{$ENDIF}");
sub(/ cdecl;/, "{$IFNDEF FPC} varargs; cdecl;{$ENDIF}"); print }'
fi

Т.е. предлагается эмулировать varargs через array of const и снятие cdecl.

yolki

собственно, так и делается. см. функцию Format

Werdna

Есть такая библиотека - libcurl. К ней есть обёртка для дельфи/FPC - CurlPas
Есть алмаз.
Зачем его мазать говном (заворачивать в может просто использовать?
На С просто напиши программу, или сделай из своей Быдлодельфи АПИ к нему такое, чтобы было в стиле Дельфи, а не помесь ежа и удава.

Bird_V

Из этой обёртки будет сделан набор компонентов для использования в пакете Windows среды HiAsm. А указанный пакет использует Object Pascal (в том его виде, который понимается Delphi 4й версии) в качестве целевого языка кодогенерации.
Оставить комментарий
Имя или ник:
Комментарий: