Вопросы по использованию FFI

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Вопросы по использованию FFI

Post by John Doe »

FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI

Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610

Примеры готовых скриптов:

Предупреждение: viewtopic.php?p=147610#p147610
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Вопросы по использованию FFI

Post by 2useven10 »

Latest post of the previous page:

При необходимости ничто не мешает изменить имя типа, не очень красиво, но сработает.
А так вариант "Type[?]" мне тоже кажется более логичным.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

2useven10 wrote:При необходимости ничто не мешает изменить имя типа, не очень красиво, но сработает.
А так вариант "Type[?]" мне тоже кажется более логичным.
Можно было бы обеспечить единообразие использования таких типов, включив их определения в winapi.lua.
(Не знаю какая у нас на этот счёт политика)

P.S.
Почитал The Old New Thing и понял что тут ошибка:
  1. local size = n*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("DWORD")
Правильнее так
  1. local size = (n-1)*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("TOKEN_PRIVILEGES")
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Вопросы по использованию FFI

Post by 2useven10 »

2useven10 wrote:ffi.sizeof("TOKEN_PRIVILEGES") неизвестен, если конечно нет варианта ffi.sizeof("TOKEN_PRIVILEGES", n)
Проверил, есть такой вариант.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Есть, но даже если и не было бы, в ffi.sizeof можно передать не только "имя типа", но и саму уже созданную структуру (на прошлой странице было).
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Вопросы по использованию FFI

Post by 2useven10 »

John Doe wrote:Есть, но даже если и не было бы, в ffi.sizeof можно передать не только "имя типа", но и саму уже созданную структуру (на прошлой странице было).
Иногда размер нужен, а объекта нет.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote:Можно было бы обеспечить единообразие использования таких типов, включив их определения в winapi.lua.
(Не знаю какая у нас на этот счёт политика)
По-хорошему, надо было бы farapi.lua и winapi.lua сделать модулями. Можно было бы при этом сделать и модуль winapiex (т.е. "extended"). Так как сделано сейчас - идеологически неправильно - эти файлы грузятся всегда, нужны они или не нужны.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Насколько я понимаю, winapi.lua раньше содержал только то, что необходимо для LuaMacro.
Затем добавились декларации базовых типов winapi.
И всё это сейчас занимает 8 кБ, так что смысла подгружать его отдельно нет.

Если только он не раздуется в 10 раз, что врядли произойдёт.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote:Если только он не раздуется в 10 раз, что врядли произойдёт.
farapi.lua + winapi.lua составляют вместе 78 KB. Вот вам и 10 раз налицо.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

farapi.lua есть смысл сделать модулем, luamacro от него не зависит.

И farapi.lua и winapi.lua можно сделать модулями, если убрать зависимость от них luamacro.
Сейчас просмотрел по-быстрому, и увидел только 3 зависимости в panelsort.lua (структура SortingPanelItem, тип HANDLE и функция StrCmpLogicalW).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Shmuel wrote:Можно было бы при этом сделать и модуль winapiex (т.е. "extended").
Предвижу сложности. Возьмём такой сценарий.
1) Какой-то скрипт не использует модуль winapiex.lua, но для своих нужд определяет тип "TOKEN_PRIVILEGES"
2) Другой скрипт пытается после этого загрузить winapiex.lua, но обламывается, т.к. ffi не даёт переопределить.

И pcall в данном случае не особо поможет

P.S.
Насколько я могу судить, облом только при попытке переопределить структуры.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote:Хотя... Предвижу сложности. Возьмём такой сценарий.
......
Либо определения оба корректны, тогда проблем нет, либо (в крайне редких случаях) можно переименовать имя структуры.

Если быть последовательными, то кроме двух вышеупомянутых файлов модулями нужно сделать и panelsort.lua, и moonscript.lua. Их все можно поместить в папку LuaMacro\modules, а плагин будет добавлять эту папку в package.path.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Либо определения оба корректны, тогда проблем нет, либо (в крайне редких случаях) можно переименовать имя структуры.
Проблема не в этом.

Любое единичное переопределение можно завернуть в pcall, как мы и делаем сейчас.
Модуль же содержит множество определений, его в pcall не завернёшь.

Устранение конфликтов переименованием структур - это какая-то ерунда, т.к. во-первых от имён структур могут зависить другие определения.
И во-вторых, конфликт в своём скрипте я устраню как-нибудь. Но если я скачал скрипт с форума, то ковырять его как-то вообще нехорошо.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote:Любое единичное переопределение можно завернуть в pcall, как мы и делаем сейчас.
Модуль же содержит множество определений, его в pcall не завернёшь.
Внутри модуля вполне можно использовать pcall, многократно.

Если кто-то выложит для скачивания модуль или скрипт, несовместимый со стандартной поставкой Фара, это его проблемы.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Shmuel wrote:Если кто-то выложит для скачивания модуль или скрипт, несовместимый со стандартной поставкой Фара, это его проблемы.
Не всё так просто.
Скрипт будет совместим со стандартной поставкой.
И даже с другими скриптами, использующими модуль, если они выполняются ДО него.
Shmuel wrote:Внутри модуля вполне можно использовать pcall, многократно.
Можно, но при большом количестве структур - это будет громоздко и медленно.

Любую проблему можно решить, я понимаю. Но зачем создавать её искуственно?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote:Не всё так просто.
Скрипт будет совместим со стандартной поставкой.
И даже с другими скриптами, использующими модуль, если они выполняются ДО него.
Если скрипт определяет те же структуры, что есть в стандартной поставке, то он несовместим, вот и всё.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Вопросы по использованию FFI

Post by John Doe »

Сегодня совместим, а завтра мы добавили в поставку новые структуры, и стал несовместим. Нехорошо.
Post Reply

Return to “Нужна помощь”