Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию 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: 1676
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 22 times
- Been thanked: 52 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: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию 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: 1676
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 22 times
- Been thanked: 52 times
Вопросы по использованию FFI
Это работает. А остальное - мы не на С пишем. Много ли вставок на ffi в макросах, чтобы невозможно было отследить? А если кто-то захочет внести "несовместимое изменение", то он сам себе злобный буратино.
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию FFI
Ещё здорово работает вообще не использовать ms-типы, только зачем.
https://t.me/FarManager — Telegram чат
- Smitis
- Posts: 1676
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 22 times
- Been thanked: 52 times
Вопросы по использованию FFI
John Doe,
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию FFI
Я считаю что в данном случае лучше взять определение без изменений, используя safedef (который всё равно уже есть).
Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Не могу сказать как он был задуман shmuel, но скорее это ваши фантазии.
По факту это просто определения базовых windows типов и констант, чтобы в каждому не определять HANDLE или LPWSTR.
И кстати, единственная именованная структура там - _UNICODE_STRING скорее оставлена по недосмотру.
- John Doe
- Бюрократ
- Posts: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию FFI
Определённо мои: от идеи до воплощения.
Воистину так.
А зачем их вообще кому-то определять?
Именно для того чтобы не сочинять потом определения для ffi, а брать готовые с msdn и применять без изменений.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Что-то я никак не пойму, где косяк. Имеется вот такой пример вызова функции
Вроде, всё правильно. Функция эта, судя по интернет-информации, в консольных приложениях работать должна. Но в примере - не работает. ОС - Windows XP. Для диагностики ошибок используется модуль
GetFileName
:Вроде, всё правильно. Функция эта, судя по интернет-информации, в консольных приложениях работать должна. Но в примере - не работает. ОС - Windows XP. Для диагностики ошибок используется модуль
ffierror.lua
(есть в приложенном архиве). В чём ошибка?- Attachments
-
- GetFileName.7z
- (2.41 KiB) Downloaded 27 times
- John Doe
- Бюрократ
- Posts: 13402
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 55 times
- Been thanked: 356 times
Вопросы по использованию 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.