Вопросы по использованию 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
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Latest post of the previous page:

Smitis wrote: Thu 29 Apr, 2021 09:16
citRiks wrote: Wed 28 Apr, 2021 18:57Если у вас есть какие-то идеи или решения для этого, то буду рад услышать конечно
Уберите _CREATE_THREAD_DEBUG_INFO, _LARGE_INTEGER и прочие везде после struct
Т.е. вместо:

Code: Select all

typedef struct _CREATE_THREAD_DEBUG_INFO {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
.. должно быть так:

Code: Select all

typedef struct _CREATE_THREAD_DEBUG_INFO {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
}
?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

citRiks,
Нет

Code: Select all

typedef struct {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
Разум когда-нибудь победит.
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 »

Структура перестаёт быть именованной, и cdef больше не выбрасывает ошибку.
Но!
а) `CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;` точно так же невозможно переопределить, и надо следить за тем чтобы не внести несовместимое изменение.
б) В последующих (потенциальных) сообщениях о рантайм ошибках - имени структуры не будет, что снизит информативность сообщений.
в) winapi.lua создавался для того, чтобы брать определения с msdn без изменений (или с минимальными), потому что см. пункт 1.

В общем так себе совет.
https://t.me/FarManager — Telegram чат
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

John Doe wrote: Sat 01 May, 2021 12:39 В общем так себе совет.
Это работает. А остальное - мы не на С пишем. Много ли вставок на 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 »

Ещё здорово работает вообще не использовать ms-типы, только зачем.
https://t.me/FarManager — Telegram чат
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

John Doe,
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Разум когда-нибудь победит.
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 »

Я считаю что в данном случае лучше взять определение без изменений, используя safedef (который всё равно уже есть).

Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
https://t.me/FarManager — Telegram чат
2useven10
Posts: 5204
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

John Doe wrote: Sat 01 May, 2021 13:34 Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
Не могу сказать как он был задуман shmuel, но скорее это ваши фантазии.
По факту это просто определения базовых windows типов и констант, чтобы в каждому не определять HANDLE или LPWSTR.
И кстати, единственная именованная структура там - _UNICODE_STRING скорее оставлена по недосмотру.
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 »

2useven10 wrote: Sat 01 May, 2021 14:42 но скорее это ваши фантазии.
Определённо мои: от идеи до воплощения.
2useven10 wrote: Sat 01 May, 2021 14:42 По факту это просто определения базовых windows типов и констант
Воистину так.
2useven10 wrote: Sat 01 May, 2021 14:42 чтобы в каждому не определять HANDLE или LPWSTR.
А зачем их вообще кому-то определять?
Именно для того чтобы не сочинять потом определения для ffi, а брать готовые с msdn и применять без изменений.
https://t.me/FarManager — Telegram чат
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Что-то я никак не пойму, где косяк. Имеется вот такой пример вызова функции GetFileName:


Вроде, всё правильно. Функция эта, судя по интернет-информации, в консольных приложениях работать должна. Но в примере - не работает. ОС - Windows XP. Для диагностики ошибок используется модуль ffierror.lua (есть в приложенном архиве). В чём ошибка?
Attachments
GetFileName.7z
(2.41 KiB) Downloaded 102 times
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 »

IgorZ wrote: Fri 26 Nov, 2021 10:22 Для диагностики ошибок используется модуль ffierror.lua
To get extended error information, call the CommDlgExtendedError function, which can return one of the following values.

И для объявления функций не стоит использовать safe_def.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

IgorZ wrote: Fri 26 Nov, 2021 10:22В чём ошибка?
Удалите из определения структуры члены lpEditInfo и lpstrPrompt, тогда будет работать.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

John Doe wrote: Fri 26 Nov, 2021 12:01 И для объявления функций не стоит использовать safe_def.
Для отладочного примера, я так понимаю, вреда не будет. А в релизе (когда он случится) всё вычищу.
Shmuel wrote: Fri 26 Nov, 2021 13:35
IgorZ wrote: Fri 26 Nov, 2021 10:22В чём ошибка?
Удалите из определения структуры члены lpEditInfo и lpstrPrompt, тогда будет работать.
Спасибо. Заработало. Вот и верь после этого майкросовтовской же документации...
Last edited by IgorZ on Mon 29 Nov, 2021 05:02, edited 1 time in total.
Ultrabyte
Posts: 86
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 8 times
Been thanked: 4 times

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

Post by Ultrabyte »

Есть исходный рабочий код:
Local Params = ffi.new("WORD[6]", 0x61,0x62,0x63,0x64,0x65,0x66) -- abcdef
нужно преобразовать, используя string:
Local Nabor = "abcdef" Local Params = ffi.new("WORD[6]", Nabor)
Как правильнее это сделать?
Last edited by Ultrabyte on Fri 19 May, 2023 21:27, edited 2 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 »

Code: Select all

local Params = ffi.new("WORD[6]", string.byte("abcdef",1,6))
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 »

А если не 6 символов?
универсальность нужна.... но и простота тоже...
SimSU ··· ·· -- ··· ··-
Post Reply

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