Delphi 4: varargs - как?
Первое, что приходит в голову: написать сишную обертку с постоянным числом аргументов и вызывать из Delphi уже ее
Можно также обойтись без обертки, а записать принудительно в стэк массив varagrs перед вызовом функции.
принудительно в стэк массив varagrs перед вызовом функции.А ты знаешь все требования cdecl-соглашения по вызову функций?
Я как бэ к тому, что удалять тоже самому придется.
появившееся в 7й (?) версии дельфей6ой вроде.
а есть доступ к обёртке этой? можно бы было переписать и вызывать с одним параметром (указатель) и дальше творить что вздумается.
есть, libcurl трогать бы не хотелось.
Пока ждал ответов, ещё раз перелопатил код обёртки, и обнаружил, что везде varargs используется для передачи одного параметра произвольного типа. Собственно вопрос теперь формулируется так: как передать в cdecl-функцию один аргумент произвольного типа?
К обёртке доступ Пока ждал ответов, ещё раз перелопатил код обёртки, и обнаружил, что везде varargs используется для передачи одного параметра произвольного типа. Собственно вопрос теперь формулируется так: как передать в cdecl-функцию один аргумент произвольного типа?
Что тебе мешает сделать из этого DLL, скомпилить под семёркой и вывести наружу необходимые функции, раз уж тебе так нужна эта библиотека.
на ассемблере напиши
Таки видимо придётся на ассемблере делать.
да почему?
Собственно вопрос теперь формулируется так: как передать в cdecl-функцию один аргумент произвольного типа?procedure foo(var x);cdecl;?
Или нужно не указатель?
А ты уверен, что это совместимо с void f(...)?
А ты уверен, что это совместимо с void f(...)?Конкретно указанная декларация - это void foo(void *x);
Если один аргумент - указатель, то должно быть совместимо. Иначе нужно обёртку делать, либо прописывать несколько одинаковых деклараций, по одной для каждого используемого типа.
о, прикольно, и правда. Т.е. на самом деле можно практически любую сигнатуру вписать вместо (...)
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.
собственно, так и делается. см. функцию Format
Есть такая библиотека - libcurl. К ней есть обёртка для дельфи/FPC - CurlPasЕсть алмаз.
Зачем его мазать говном (заворачивать в может просто использовать?
На С просто напиши программу, или сделай из своей Быдлодельфи АПИ к нему такое, чтобы было в стиле Дельфи, а не помесь ежа и удава.
HiAsm. А указанный пакет использует Object Pascal (в том его виде, который понимается Delphi 4й версии) в качестве целевого языка кодогенерации.
Из этой обёртки будет сделан набор компонентов для использования в пакете Windows среды Оставить комментарий
Bird_V
Есть такая библиотека - libcurl. К ней есть обёртка для дельфи/FPC - CurlPas. Так как libcurl изначально C-шный, то активно использует функции с переменным числом аргументов. Упомянутая обёртка использует ключевое слово varargs, появившееся в 7й (?) версии дельфей, а работа ведётся с 4-й версией (и поменять никак нельзя).Вопрос в следующем: как в 4-х дельфях корректно обернуть вызов C-функций c переменным числом аргументов?