Вопросы по использованию 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:
Т.е. вместо:
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;
}
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Вопросы по использованию FFI
citRiks,
Нет
Нет
Code: Select all
typedef struct {
HANDLE hThread;
LPVOID lpThreadLocalBase;
LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Структура перестаёт быть именованной, и cdef больше не выбрасывает ошибку.
Но!
а) `CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;` точно так же невозможно переопределить, и надо следить за тем чтобы не внести несовместимое изменение.
б) В последующих (потенциальных) сообщениях о рантайм ошибках - имени структуры не будет, что снизит информативность сообщений.
в) winapi.lua создавался для того, чтобы брать определения с msdn без изменений (или с минимальными), потому что см. пункт 1.
В общем так себе совет.
Но!
а) `CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;` точно так же невозможно переопределить, и надо следить за тем чтобы не внести несовместимое изменение.
б) В последующих (потенциальных) сообщениях о рантайм ошибках - имени структуры не будет, что снизит информативность сообщений.
в) winapi.lua создавался для того, чтобы брать определения с msdn без изменений (или с минимальными), потому что см. пункт 1.
В общем так себе совет.
https://t.me/FarManager — Telegram чат
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Вопросы по использованию FFI
Это работает. А остальное - мы не на С пишем. Много ли вставок на ffi в макросах, чтобы невозможно было отследить? А если кто-то захочет внести "несовместимое изменение", то он сам себе злобный буратино.
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Ещё здорово работает вообще не использовать ms-типы, только зачем.
https://t.me/FarManager — Telegram чат
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Вопросы по использованию FFI
John Doe,
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Я считаю что в данном случае лучше взять определение без изменений, используя safedef (который всё равно уже есть).
Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Не могу сказать как он был задуман shmuel, но скорее это ваши фантазии.
По факту это просто определения базовых windows типов и констант, чтобы в каждому не определять HANDLE или LPWSTR.
И кстати, единственная именованная структура там - _UNICODE_STRING скорее оставлена по недосмотру.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Определённо мои: от идеи до воплощения.
Воистину так.
А зачем их вообще кому-то определять?
Именно для того чтобы не сочинять потом определения для ffi, а брать готовые с msdn и применять без изменений.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Что-то я никак не пойму, где косяк. Имеется вот такой пример вызова функции
Вроде, всё правильно. Функция эта, судя по интернет-информации, в консольных приложениях работать должна. Но в примере - не работает. ОС - Windows XP. Для диагностики ошибок используется модуль
GetFileName
:Вроде, всё правильно. Функция эта, судя по интернет-информации, в консольных приложениях работать должна. Но в примере - не работает. ОС - Windows XP. Для диагностики ошибок используется модуль
ffierror.lua
(есть в приложенном архиве). В чём ошибка?- Attachments
-
- GetFileName.7z
- (2.41 KiB) Downloaded 104 times
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
To get extended error information, call the
CommDlgExtendedError
function, which can return one of the following values.И для объявления функций не стоит использовать safe_def.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Для отладочного примера, я так понимаю, вреда не будет. А в релизе (когда он случится) всё вычищу.
Спасибо. Заработало. Вот и верь после этого майкросовтовской же документации...
Last edited by IgorZ on Mon 29 Nov, 2021 05:02, edited 1 time in total.
Вопросы по использованию FFI
Есть исходный рабочий код:
нужно преобразовать, используя string:Local Params = ffi.new("WORD[6]", 0x61,0x62,0x63,0x64,0x65,0x66) -- abcdef
Как правильнее это сделать?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.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Code: Select all
local Params = ffi.new("WORD[6]", string.byte("abcdef",1,6))
https://t.me/FarManager — Telegram чат