Вопросы по использованию 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:
Вопросы по использованию FFI
В данном случае из контекста неясно как в дальнейшем будет использоваться
Params
, и учитывая что размер массива указан фиксированный я намеренно использовал string
, т.к. в противном случае любое не ascii значение даст другую длину.
Last edited by John Doe on Fri 26 May, 2023 10:05, edited 1 time in total.
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4236
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 643 times
- Contact:
Вопросы по использованию FFI
В процедуре сортировки я написал такое:
Вроде, работает…
Code: Select all
local U8 = win.Utf16ToUtf8
local function String(cStr)
if tostring(cStr) == "cdata<const unsigned short *>: NULL" then return nil end
return U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
end
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Вопросы по использованию FFI
Если это ваш ответ на задачу с прошлой страницы, то похоже не в тему.
Разве так не работает?Code: Select all
if tostring(cStr) == "cdata<const unsigned short *>: NULL" then return nil end
Code: Select all
if cStr==nil then return nil end
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Идем дальше
return cStr and U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
?
почему не написать:
return cStr and U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
?
SimSU ··· ·· -- ··· ··-
Вопросы по использованию FFI
Я использовал такой способ:
str = "abcdefABCDEF" local Params = ffi.new("WORD["..string.len(str).."]", string.byte(str,1,string.len(str)))
Спасибо за ответ, но есть нюанс, в ffi.new есть указатель WORD, то есть нужно как-то из string.byte в string.word, но такую функцию не нашел.
Может быть есть другое решение, чтобы по два байта?
(p.s. я признаю ошибку, что в прошлом тесте не показал более точный пример, а именно двухбайтовые hex:
Local Params = ffi.new("WORD[6]", 0x0061,0x0062,0x0063,0x0430, 0x0431, 0x0432) -- abcабв
Last edited by Ultrabyte on Fri 19 May, 2023 23:56, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Вопросы по использованию FFI
Наверняка есть. Но чтобы на эту тему можно было предметно продолжать, желательно видеть больше контекста.
Т.е. почему именно такой формат данных и как он используется далее.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Там использую функцию winAPI и входные данные строго UTF16.
Я предварительно конечно преобразую Utf8ToUtf16
Код рабочий, если руками прописывать 0x0061,0x0062,0x0063,0x0430, 0x0431, 0x0432 и т.д.Nabor = win.Utf8ToUtf16("abcабв")
Осталось немного - это двухбайтовые String. Казалось изящное решение где-то близко, но ускользает..
Last edited by Ultrabyte on Sat 20 May, 2023 00:05, edited 3 times in total.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Вопросы по использованию FFI
Выше Shmuel уже предлагал использовать
utf8.byte
, вроде бы как раз то чего вы хотите.https://t.me/FarManager — Telegram чат
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Вопросы по использованию FFI
Не получается использовать ToUnicode.
Функция почему-то возвращает всегда 0.
Вероятно, я что-то не так делаю?
Функция почему-то возвращает всегда 0.
Вероятно, я что-то не так делаю?
Code: Select all
local ffi = require"ffi"
ffi.cdef[[
int ToUnicode( //https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-tounicode
UINT wVirtKey, // [in]
UINT wScanCode, // [in]
const BYTE *lpKeyState, // [in, optional]
LPWSTR pwszBuff, // [out]
int cchBuff, // [in]
UINT wFlags // [in]
);
]]
local C = ffi.C
local buf = ("\0"):rep(16)
local rec = far.NameToInputRecord"q"
local vk,sc = rec.VirtualKeyCode,rec.VirtualScanCode -- 81,16
far.Show(C.ToUnicode(vk,sc,nil,ffi.cast("void*",buf),4,0))
https://t.me/FarManager — Telegram чат
- HaRT
- Moderator
- Posts: 10823
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Вопросы по использованию FFI
У меня она и возвращает
0
. Т.ч. дело не в FFI.Фар есть инструмент, а не нянька. © 2009 DrKnS
-
- Posts: 1326
- Joined: Mon 04 Apr, 2005 13:41
- Location: San Ramon, CA / Kharkov, UA
- Has thanked: 32 times
- Been thanked: 61 times
Вопросы по использованию FFI
У меня возвращает 1 и 'q' в buf.
Last edited by Yegor on Tue 20 Jun, 2023 02:20, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин