Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 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
Вопросы по использованию FFI
Latest post of the previous page:
Ага! Вот оно откуда берется! А я удивлялся, откуда FFI знает все эти LPSTR и DWORD. Включение туда также и имен с T считаю разумным, т.к. это позволяет копировать объявления функций прямо со страничек MSDN. Может, еще следующее включить (если это возможно):- WINAPI
- _In_, _In_opt_, _Inout_ и т.д.
- LPSECURITY_ATTRIBUTES
- LPOVERLAPPED
Тогда бы можно было копировать все определения прямо со страничек MSDN без каких-либо правок.
И еще какую-нибудь функцию для простого преобразования строк Lua в строки/объекты, пригодные для вызовов WINAPI, и обратно. А то я смотрю, тут даже "киты" кустарничают.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Невозможно, ffi макросы не понимает.- WINAPI
- _In_, _In_opt_, _Inout_ и т.д.
Да, в winapi.lua сейчас определяется SECURITY_ATTRIBUTES, вполне разумно добавить туда же и производные типы.LPSECURITY_ATTRIBUTES
А тут не уверен (так ведь можно добавлять бесконечно).LPOVERLAPPED
В настоящий момент в winapi.lua в основном представлены типы отсюда.
Вопросы по использованию FFI
LPOVERLAPPED используется как параметр в функции ReadFile (и WriteFile). Думаю, что т.к. эти функции "довольно базовые" (или нет?), то хорошо было бы, чтобы типы их параметеров регистрировались автоматически. А насчет бесконечности -- это да, WINAPI большой...John Doe wrote:А тут не уверен (так ведь можно добавлять бесконечно).
Вопросы по использованию FFI
Что-то я сомневаюсь, что вы когда-нибудь реально на lua будете использовать LPOVERLAPPED )
IMHO его достаточно на "void*" заменить
IMHO его достаточно на "void*" заменить
Вопросы по использованию FFI
Реально я его и не собираюсь использовать. Но в объявлении функции (скопировано из MSDN) оно присутствует. Редактировать там что-либо не хочется. Так что в тексте это имя встречается.
Это "реальное" использование? Вроде нет. Но ведь и не воображаемое! :-)
Это "реальное" использование? Вроде нет. Но ведь и не воображаемое! :-)
Вопросы по использованию FFI
Как с помощью
string.format
вывести значение WINAPI HANDLE? Спецификатора %p
в Lua вроде нету. При использовании %u
в качестве формата и ffi.cast("unsigned int", handle)
в качестве значения выдается ошибка: bad argument #2 to 'format' (number expected, got cdata).Вопросы по использованию FFI
Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка. Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.
По идее, любой Jit должен "влезать" сам по мере надобности/целесообразности. И не должен менять результат выполнения программы. Поэтому меня удивляет, что в одном месте %p есть, а в другом нет.
А как сделать без %p?
По идее, любой Jit должен "влезать" сам по мере надобности/целесообразности. И не должен менять результат выполнения программы. Поэтому меня удивляет, что в одном месте %p есть, а в другом нет.
А как сделать без %p?
-
- Posts: 6834
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Что-то не так делали, значит.fml2 wrote:Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка.
Фар использует LuaJIT, иfml2 wrote:Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.
%p
в string.format
должно работать.- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
>А как сделать без %p?
Что касается %p, то нужно помнить что при вызове
tostring(handle):gsub("cdata<unsigned int>: ","")
tostring(handle):match": (0x%w+)"
Что касается %p, то нужно помнить что при вызове
format
как метода (через двоеточие) используется вовсе не string.format
Вопросы по использованию FFI
tostring(handle)
у меня выдает нечто типа "cdata<void *>: 0x0000029c" -- не то, что надоtonumber(handle)
выдает nil -- не то, что надоtonumber(ffi.cast("UINT_PTR", handle))
выдает то, что надо. Но почему так сложно?При задании спецификатора "%p" и handle в качестве значения вылезает ошибка dbgprint.lua:49: invalid option '%p' to 'format' (я пользуюсь модулем dbgprint для вывода отладочной информации, в указанной строке стоит "
fmt:format(...
")- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
0x0000029c
- вроде бы как раз то что надо, не?
Что и требовалось доказать.
Вопросы по использованию FFI
Не совсем. Надо отрезать кусок в начале
Я ничего не пытался доказать, а просто спрашивал, как вывести значение типа HANDLE, и удивлялся, что это делается не совсем просто
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопросы по использованию FFI
результат:
tostring и cast выдают одинаковый результат, не знаю в чём там у вас проблема. %p выводит что-то странное, да.
Code: Select all
╔═══════════════════════════════╗
║ 1│ cdata<void *>: 0x00000007 ║ <- ok
║ 2│ cdata<void *>: 0x00000007 ║ <- ok
║ 3│ nil ║
║ 4│ 7 ║ <- ok
║ 5│ 0x01e04fa8 ║ <- ???
╚═════════ 5 arguments ═════════╝