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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

Latest post of the previous page:

Ага! Вот оно откуда берется! А я удивлялся, откуда FFI знает все эти LPSTR и DWORD. Включение туда также и имен с T считаю разумным, т.к. это позволяет копировать объявления функций прямо со страничек MSDN. Может, еще следующее включить (если это возможно):

- WINAPI
- _In_, _In_opt_, _Inout_ и т.д.
- LPSECURITY_ATTRIBUTES
- LPOVERLAPPED

Тогда бы можно было копировать все определения прямо со страничек MSDN без каких-либо правок.

И еще какую-нибудь функцию для простого преобразования строк Lua в строки/объекты, пригодные для вызовов WINAPI, и обратно. А то я смотрю, тут даже "киты" кустарничают.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

- WINAPI
- _In_, _In_opt_, _Inout_ и т.д.
Невозможно, ffi макросы не понимает.
LPSECURITY_ATTRIBUTES
Да, в winapi.lua сейчас определяется SECURITY_ATTRIBUTES, вполне разумно добавить туда же и производные типы.
LPOVERLAPPED
А тут не уверен (так ведь можно добавлять бесконечно).
В настоящий момент в winapi.lua в основном представлены типы отсюда.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

John Doe wrote:А тут не уверен (так ведь можно добавлять бесконечно).
LPOVERLAPPED используется как параметр в функции ReadFile (и WriteFile). Думаю, что т.к. эти функции "довольно базовые" (или нет?), то хорошо было бы, чтобы типы их параметеров регистрировались автоматически. А насчет бесконечности -- это да, WINAPI большой...
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

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

Post by Maximus5 »

Что-то я сомневаюсь, что вы когда-нибудь реально на lua будете использовать LPOVERLAPPED )
IMHO его достаточно на "void*" заменить
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

Реально я его и не собираюсь использовать. Но в объявлении функции (скопировано из MSDN) оно присутствует. Редактировать там что-либо не хочется. Так что в тексте это имя встречается.

Это "реальное" использование? Вроде нет. Но ведь и не воображаемое! :-)
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

Как с помощью string.format вывести значение WINAPI HANDLE? Спецификатора %p в Lua вроде нету. При использовании %u в качестве формата и ffi.cast("unsigned int", handle) в качестве значения выдается ошибка: bad argument #2 to 'format' (number expected, got cdata).
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

fml2 wrote:Как с помощью string.format вывести значение WINAPI HANDLE? Спецификатора %p в Lua вроде нету.
В Lua нету, в LuaJIT есть.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка. Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.

По идее, любой Jit должен "влезать" сам по мере надобности/целесообразности. И не должен менять результат выполнения программы. Поэтому меня удивляет, что в одном месте %p есть, а в другом нет.

А как сделать без %p?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

fml2 wrote:Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка.
Что-то не так делали, значит.
fml2 wrote:Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.
Фар использует LuaJIT, и %p в string.format должно работать.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

>А как сделать без %p?
tostring(handle):gsub("cdata<unsigned int>: ","")
tostring(handle):match": (0x%w+)"
Что касается %p, то нужно помнить что при вызове format как метода (через двоеточие) используется вовсе не string.format
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

tostring разве не работает?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Работает

P.S.
Так тоже работает: tonumber(ffi.cast("UINT_PTR",handle))
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

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(...")
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

fml2 wrote: нечто типа "cdata<void *>: 0x0000029c" -- не то, что надо
0x0000029c - вроде бы как раз то что надо, не?
fml2 wrote: fmt:format
Что и требовалось доказать.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

John Doe wrote: вроде бы как раз то что надо, не?
Не совсем. Надо отрезать кусок в начале
John Doe wrote: Что и требовалось доказать.
Я ничего не пытался доказать, а просто спрашивал, как вывести значение типа HANDLE, и удивлялся, что это делается не совсем просто
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

  1. local ffi=require("ffi")
  2.  
  3. local C=ffi.C
  4.  
  5. ffi.cdef[[
  6.  
  7. void* GetStdHandle(uint32_t nStdHandle);
  8.  
  9. ]]
  10.  
  11. local handle=C.GetStdHandle(-11)
  12.  
  13. far.Show(handle,tostring(handle),tonumber(handle),tonumber(ffi.cast("UINT_PTR", handle)),string.format("%p",handle))
результат:

Code: Select all

╔═══════════════════════════════╗
║  1│ cdata<void *>: 0x00000007 ║ <- ok
║  2│ cdata<void *>: 0x00000007 ║ <- ok
║  3│ nil                       ║
║  4│ 7                         ║ <- ok
║  5│ 0x01e04fa8                ║ <- ???
╚═════════ 5 arguments ═════════╝
tostring и cast выдают одинаковый результат, не знаю в чём там у вас проблема. %p выводит что-то странное, да.
Post Reply

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