Вопросы по использованию 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
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Latest post of the previous page:

А если не 6 символов?
универсальность нужна.... но и простота тоже...
SimSU ··· ·· -- ··· ··-
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe, ваш пример рабочий, но правильно использовать utf8.byte

Ultrabyte, вы вполне можете переменную Nabor назвать Набор, будет работать.
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 »

Shmuel wrote: Fri 19 May, 2023 21:35 но правильно использовать utf8.byte
В данном случае из контекста неясно как в дальнейшем будет использоваться 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 чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

В процедуре сортировки я написал такое:

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
Вроде, работает…
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe wrote: Fri 19 May, 2023 21:46 я намеренно использовал string, т.к. в противном случае любое не ascii значение даст другую длину.
Можно пример?
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 »

Shmuel, был не прав
https://t.me/FarManager — Telegram чат
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 »

buniak_a_h wrote: Fri 19 May, 2023 21:46 В процедуре сортировки я написал такое:
Если это ваш ответ на задачу с прошлой страницы, то похоже не в тему.

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 чат
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Идем дальше
John Doe wrote: Fri 19 May, 2023 21:55 if cStr==nil then return nil end
почему не написать:
return cStr and U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
?
SimSU ··· ·· -- ··· ··-
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

SUSim wrote: Fri 19 May, 2023 22:08 return cStr and
Это FFI, у него свои тонкости.
Нельзя: cStr and ....
Правильно: cStr ~= nil and ....
Ultrabyte
Posts: 86
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 8 times
Been thanked: 4 times

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

Post by Ultrabyte »

SUSim wrote: Fri 19 May, 2023 21:33 А если не 6 символов?
универсальность нужна.... но и простота тоже...
Я использовал такой способ:
str = "abcdefABCDEF" local Params = ffi.new("WORD["..string.len(str).."]", string.byte(str,1,string.len(str)))
John Doe wrote: Fri 19 May, 2023 21:46 т.к. в противном случае любое не ascii значение даст другую длину.
Спасибо за ответ, но есть нюанс, в 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.
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 »

Ultrabyte wrote: Fri 19 May, 2023 23:47 Может быть есть другое решение, чтобы по два байта?
Наверняка есть. Но чтобы на эту тему можно было предметно продолжать, желательно видеть больше контекста.
Т.е. почему именно такой формат данных и как он используется далее.
https://t.me/FarManager — Telegram чат
Ultrabyte
Posts: 86
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 8 times
Been thanked: 4 times

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

Post by Ultrabyte »

John Doe wrote: Fri 19 May, 2023 23:56 Наверняка есть. Но чтобы на эту тему можно было предметно продолжать, желательно видеть больше контекста.
Т.е. почему именно такой формат данных и как он используется далее.
Там использую функцию winAPI и входные данные строго UTF16.
Я предварительно конечно преобразую Utf8ToUtf16
Nabor = win.Utf8ToUtf16("abcабв")
Код рабочий, если руками прописывать 0x0061,0x0062,0x0063,0x0430, 0x0431, 0x0432 и т.д.
Осталось немного - это двухбайтовые String. Казалось изящное решение где-то близко, но ускользает..
Last edited by Ultrabyte on Sat 20 May, 2023 00:05, edited 3 times in total.
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 »

Ultrabyte wrote: Sat 20 May, 2023 00:03 Осталось немного - это двухбайтовые String.
Выше Shmuel уже предлагал использовать utf8.byte, вроде бы как раз то чего вы хотите.
https://t.me/FarManager — Telegram чат
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 »

Не получается использовать ToUnicode.
Функция почему-то возвращает всегда 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 чат
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

John Doe wrote: Mon 19 Jun, 2023 22:04 Функция почему-то возвращает всегда 0.
У меня она и возвращает 0. Т.ч. дело не в FFI.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

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

Post by Yegor »

У меня возвращает 1 и 'q' в buf.
Last edited by Yegor on Tue 20 Jun, 2023 02:20, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Post Reply

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