Есть такой продукт Wine, он предоставляет Win32 API в Linux. Он сносно позволяет запускать Win32 приложения в линуксе, это есть binary совместимость. Так же можно в чисто линукс приложениях пользоваться Win32 API, это есть совместимость по исходникам. Win32 API поставляется Wine-ом в Stdcall calling convention. GNAT позволяет делать Stdcall вызовы только в Windows. В Linux Stdcall делает сишное соглашение. Получается, что пользоваться Wine Win32 API в GNAT Linux напрямую невозможно. Можно писать какие то враперы конечно преобразующие вызов из одного соглашения в другое, но это как то нехорошо, по моему мнению. Разрешить настоящий Stdcall в линуксе, можно 2-мя способами. 1. Сделать парамер командной строки для линукса, который означает, что Stdcall надо воспринимать как настоящий Stdcall, несмотря на то что мы в линуксе. 2. Сделать дополнительный calling convention, который независимо от операционки делает виндовое соглашение о вызове, назвать его например Win_API. 1 вариант лично для меня выглядить предпочтительнее, потому что не надо будет переписывать тип соглашения в Win32Ada. Можно и оба варианта сделать, они друг другу не противоречат. Вопрос. Кто нибудь изучал GNAT исходники настолько, что бы подсказать мне, где эти функции можно внедрить в GNAT ? Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.
> > Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается. > decl.c: /* Convention_Stdcall should be processed in a specific way on Windows targets only. The macro below is a helper to avoid having to check for a Windows specific attribute throughout this unit. */ #if TARGET_DLLIMPORT_DECL_ATTRIBUTES #define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall) #else #define Has_Stdcall_Convention(E) (0) #endif
Vadim Godunko wrote: >> Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается. >> >> > decl.c: > > /* Convention_Stdcall should be processed in a specific way on Windows > targets > only. The macro below is a helper to avoid having to check for a Windows > specific attribute throughout this unit. */ > > #if TARGET_DLLIMPORT_DECL_ATTRIBUTES > #define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall) > #else > #define Has_Stdcall_Convention(E) (0) > #endif > Тупо удалил условие и оставил только #define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall) Stdcall в линуксе стал работать, но с вайном все равно дружить не стало. Там наверное что то еще хитрее.
Dmitriy Anisimkov wrote: > > Stdcall в линуксе стал работать, но с вайном все равно дружить не стало. > Там наверное что то еще хитрее. > А зачем такое хитрое решение? PS. Может там кросскомпиляция нужна?
Vadim Godunko wrote: > Dmitriy Anisimkov wrote: > >> Stdcall в линуксе стал работать, но с вайном все равно дружить не стало. >> Там наверное что то еще хитрее. > зачем такое хитрое решение? > Для совместимости с Win32 приложениями на уровне исходников. Что бы не надо было кросс компилятор, если уже есть линуксовый компилятор. > PS. Может там кросскомпиляция нужна? Кросскомпиляция не нужна, Win32 API доступно через вот такие файлы user32.dll.so. Там наверное какое то хитрое соглашение о вызове. Или может я че не так делаю. А на самом деле это уже стало мне не актуально, потому что DDE под Wine глючит само по себе, и все равно пришлось в виндах тестировать.
19.09.2007 11:42, Dmitriy Anisimkov пишет: > Есть такой продукт Wine, он предоставляет Win32 API в Linux. > Он сносно позволяет запускать Win32 приложения в линуксе, это есть > binary совместимость. > Так же можно в чисто линукс приложениях пользоваться Win32 API, это есть > совместимость по исходникам. > > Win32 API поставляется Wine-ом в Stdcall calling convention. > > GNAT позволяет делать Stdcall вызовы только в Windows. > В Linux Stdcall делает сишное соглашение. > > Получается, что пользоваться Wine Win32 API в GNAT Linux напрямую > невозможно. > Можно писать какие то враперы конечно преобразующие вызов из одного > соглашения в другое, > но это как то нехорошо, по моему мнению. Разбираясь с возможностями GNAT, обнаружил такое: https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gnat_rm/Pragma-Machine_005fAttribute.html#Pragma-Machine_005fAttribute Это можно скомбинировать с атрибутом stdcall отсюда: https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Function-Attributes.html А для своих целей я искал, как бы сделать адскую функцию varargs. Потому что интринсик __builtin_va_start импортировать получается, а воспользоваться им — нет. error: 'va_start' used in function with fixed args Атрибута varargs, к сожалению, не вижу, а жаль. Это бы многое упростило. Может, varargs в GCC — это не свойство функции, как в Delphi, а наличие аргумента какого–т оособог отип. аН еразгада лпок аэт узагадк, упридёт, сяпохо, жевооб, libffi щеподключа, тьслишк ом ужгуст API, о йскотор ымнуж норабота. т ьСуважени, емЛеваш евИв, анБарна -- If you want to get to the top, you have to start at the bottom
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти