Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 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: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Latest post of the previous page:
Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?TOKEN_PRIVILEGES structure wrote:[...]
Important The constant ANYSIZE_ARRAY is defined as 1 in the public header Winnt.h. To create this array with more than one element, you must allocate sufficient memory for the structure to take into account additional elements.
- Если следовать буквально, то как я понимаю надо вычислить размер структуры с учётом реального размера массива, выделить под неё память, и привести к нужному типу:
- С другой стороны, в ffi есть ведь специальные средства.
Я ничего не упускаю?
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
В первом случае размер известен (ANYSIZE_ARRAY==1)
Во втором ffi.sizeof не используется Да и вообще,
Во втором ffi.sizeof не используется Да и вообще,
ffi.sizeof("TOKEN_PRIVILEGES")
не используется ни в одном из премеров выше- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Code: Select all
local struct = ffi.new("char[?]",size)
struct = ffi.cast("TOKEN_PRIVILEGES *",struct)
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Я не просто так предлагаю это обсудить.John Doe wrote:Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?
Невозможно переопределить уже объявленный тип, ffi не даёт.
Если будет 2 скрипта с разными определениями, то один из них поломается.
Было бы неплохо договориться о совместимом способе.
Предлагаю в качестве
ANYSIZE_ARRAY
всегда использовать ?
.- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Можно было бы обеспечить единообразие использования таких типов, включив их определения в winapi.lua.2useven10 wrote:При необходимости ничто не мешает изменить имя типа, не очень красиво, но сработает.
А так вариант "Type[?]" мне тоже кажется более логичным.
(Не знаю какая у нас на этот счёт политика)
P.S.
Почитал The Old New Thing и понял что тут ошибка: Правильнее так
-
- Posts: 6819
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Re: Вопросы по использованию FFI
По-хорошему, надо было бы farapi.lua и winapi.lua сделать модулями. Можно было бы при этом сделать и модуль winapiex (т.е. "extended"). Так как сделано сейчас - идеологически неправильно - эти файлы грузятся всегда, нужны они или не нужны.John Doe wrote:Можно было бы обеспечить единообразие использования таких типов, включив их определения в winapi.lua.
(Не знаю какая у нас на этот счёт политика)
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Насколько я понимаю, winapi.lua раньше содержал только то, что необходимо для LuaMacro.
Затем добавились декларации базовых типов winapi.
И всё это сейчас занимает 8 кБ, так что смысла подгружать его отдельно нет.
Если только он не раздуется в 10 раз, что врядли произойдёт.
Затем добавились декларации базовых типов winapi.
И всё это сейчас занимает 8 кБ, так что смысла подгружать его отдельно нет.
Если только он не раздуется в 10 раз, что врядли произойдёт.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
farapi.lua есть смысл сделать модулем, luamacro от него не зависит.
И farapi.lua и winapi.lua можно сделать модулями, если убрать зависимость от них luamacro.
Сейчас просмотрел по-быстрому, и увидел только 3 зависимости в panelsort.lua (структура SortingPanelItem, тип HANDLE и функция StrCmpLogicalW).
И farapi.lua и winapi.lua можно сделать модулями, если убрать зависимость от них luamacro.
Сейчас просмотрел по-быстрому, и увидел только 3 зависимости в panelsort.lua (структура SortingPanelItem, тип HANDLE и функция StrCmpLogicalW).
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Re: Вопросы по использованию FFI
Предвижу сложности. Возьмём такой сценарий.Shmuel wrote:Можно было бы при этом сделать и модуль winapiex (т.е. "extended").
1) Какой-то скрипт не использует модуль winapiex.lua, но для своих нужд определяет тип "TOKEN_PRIVILEGES"
2) Другой скрипт пытается после этого загрузить winapiex.lua, но обламывается, т.к. ffi не даёт переопределить.
И pcall в данном случае не особо поможет
P.S.
Насколько я могу судить, облом только при попытке переопределить структуры.