Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13860
- 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
-
- Posts: 6839
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Latest post of the previous page:
Да, для этого даже добавлен файл LuaMacro\farapi.lua.John Doe wrote:Возможно ли через ffi как-то воспользоваться C-функциями far api?
Для получения указателя на PluginStartupInfo есть ф-ция far.CPluginStartupInfo, нужно cделать ffi.cast() от результата её вызова.
- John Doe
- Бюрократ
- Posts: 13860
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Не могу сообразить как этим воспользоваться.
При попытке
При попытке
ffi.cast("PluginStartupInfo*",far.CPluginStartupInfo())
получаю ошибку declaration specifier expected near 'PluginStartupInfo'- John Doe
- Бюрократ
- Posts: 13860
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Спасибо, так отлично.
Пытаясь углубиться далее понял что документация FFI слишком лаконична, хотя много информации можно выудить из рассылки.
Пытаясь углубиться далее понял что документация FFI слишком лаконична, хотя много информации можно выудить из рассылки.
- John Doe
- Бюрократ
- Posts: 13860
- 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: 13860
- 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: 6839
- 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: 13860
- 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: 13860
- 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: 13860
- 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: 13860
- 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: 13860
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
В общем, чтобы сделать годный патч надо разбираться в C побольше чем я.
Так что оставляю на ваше усмотрение.
Так что оставляю на ваше усмотрение.
-
- Posts: 6839
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Тут дело не в усмотрении, а во времени, которое не всегда есть.John Doe wrote:Так что оставляю на ваше усмотрение.
Заводите тикет на мантисе, может у кого-нибудь когда-нибудь руки дойдут.