Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Latest post of the previous page:
Спасибо, так отлично.Пытаясь углубиться далее понял что документация FFI слишком лаконична, хотя много информации можно выудить из рассылки.
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Также в комплекте есть winapi.lua, в связи с чем возникло несколько вопросов по использованию специфических типов данных winapi.Shmuel wrote:Да, для этого даже добавлен файл LuaMacro\farapi.lua.John Doe wrote:Возможно ли через ffi как-то воспользоваться C-функциями far api?
При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.
Меня интересует какой из путей предпочтительнее?
(В winapi.lua определены слишком малая их часть)
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Также интересует вопрос как лучше определять C-константы.
Например верно ли это:
Например верно ли это:
Code: Select all
local STD_OUTPUT_HANDLE = ffi.new("unsigned long",-11)
local INVALID_HANDLE_VALUE = ffi.cast("void*",-1)
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
1. Оба пути равнозначны, предпочтительность того или иного зависит от разных факторов.John Doe wrote:При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.
Меня интересует какой из путей предпочтительнее?
(В winapi.lua определены слишком малая их часть)
2. "Малая часть" - в основном то, что нужно для farapi.lua.
Посмотрите в farapi.lua, там определена куча констант.John Doe wrote:Также интересует вопрос как лучше определять C-константы.
Например верно ли это:Code: Select all
local STD_OUTPUT_HANDLE = ffi.new("unsigned long",-11) local INVALID_HANDLE_VALUE = ffi.cast("void*",-1)
Пока есть проблема только с 64-битными константами, их действительно приходится определять вне ffi.cdef, но для этого не надо ffi.new, просто можно определить
MY_CONST=123LL
.Для STD_OUTPUT_HANDLE можно
ffi.cdef "static const unsigned long STD_OUTPUT_HANDLE = -11;"
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Поначалу я не понял как использовать определённые таким образом константы, но методом тыка получилось через индексацию ffi.C. Или можно иначе?Shmuel wrote:Посмотрите в farapi.lua, там определена куча констант.
И как правильно проверить что константа уже была определена (чтобы избежать проблемы при попытке "переопределения" константы)?
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
В picture.lua используется safe_cdefShmuel wrote:2. pcall(ffi.cdef, arg). Есть и другие способы, см. в коде макросов zg.
Для безопасного определения констант можно использовать нечто подобное: Использовать как
safe_const("ULONG","SEE_MASK_NOCLOSEPROCESS","0x00000040")
P.S.
Всё-таки как же определить константу-указатель?
Вот это вызывает invalid C type
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Вообще кажется удобным использовать в определениях функций именно Windows data types.Shmuel wrote:1. Оба пути равнозначны, предпочтительность того или иного зависит от разных факторов.John Doe wrote:При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.
Однако необходимость их дефиниции, плюс защита от редефиниции сильно снижают это удобство.
Раз уж у нас есть winapi.lua, может быть стоит определить там основные типы? http://msdn.microsoft.com/library/aa383751
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Попалось два варианта
https://github.com/luapower/winapi/blob ... ntypes.lua
https://github.com/Wiladams/LJIT2Win32/ ... WTypes.lua
Или просто код собранный в той статье MSDN
Хотя... в алфавитном порядке оно бесполезно, проще взять исходник (BaseTsd.h;WinDef.h;WinNT.h)
https://github.com/luapower/winapi/blob ... ntypes.lua
https://github.com/Wiladams/LJIT2Win32/ ... WTypes.lua
Или просто код собранный в той статье MSDN
Хотя... в алфавитном порядке оно бесполезно, проще взять исходник (BaseTsd.h;WinDef.h;WinNT.h)
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
В общем, чтобы сделать годный патч надо разбираться в C побольше чем я.
Так что оставляю на ваше усмотрение.
Так что оставляю на ваше усмотрение.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Тут дело не в усмотрении, а во времени, которое не всегда есть.John Doe wrote:Так что оставляю на ваше усмотрение.
Заводите тикет на мантисе, может у кого-нибудь когда-нибудь руки дойдут.
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Сделал сам, сверив по MSDN содержимое указанных заголовочных файлов.
Лишнее убрал, недостающее добавил.
Строки, конфликтующие с текущим содержимым winapi.lua закомментированы.
Строки 95 и 99 надо уточнить, т.к. я не уверен что значит !defined(_M_IX86)
Лишнее убрал, недостающее добавил.
Строки, конфликтующие с текущим содержимым winapi.lua закомментированы.
Строки 95 и 99 надо уточнить, т.к. я не уверен что значит !defined(_M_IX86)
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Применил к LuaMacro\winapi.lua.
Обновлённый winapi.lua
Diff: https://github.com/svn2github/farmanager/pull/1/files
Обновлённый winapi.lua
Diff: https://github.com/svn2github/farmanager/pull/1/files
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Code: Select all
shmuel 08.03.2014 00:08:20 +0200 - build 297
1. Уточнение build 296.
shmuel 07.03.2014 22:30:54 +0200 - build 296
1. Расширение winapi.lua (от John Doe).