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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

Вопросы по использованию 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: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 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: 1653
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 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: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

Вопросы по использованию 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: 1653
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

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

Post by Smitis »

John Doe wrote: Sat 01 May, 2021 12:39 В общем так себе совет.
Это работает. А остальное - мы не на С пишем. Много ли вставок на ffi в макросах, чтобы невозможно было отследить? А если кто-то захочет внести "несовместимое изменение", то он сам себе злобный буратино.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

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

Post by John Doe »

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

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

Post by Smitis »

John Doe,
Вот Вы сами пишите "брать определения с msdn без изменений (или с минимальными)". Вот и надо так и делать. С минимальными изменениями. А если кто-то будет вносить несовместимые изменения, проблема в любом случае возникнет. Это далеко не единственный способ навредить.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

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

Post by John Doe »

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

Убрать имя, или вообще все ms-типы - тоже правильно.
Но winapi.lua был задуман как раз для того, чтобы таким заниматься не приходилось.
https://t.me/FarManager — Telegram чат
2useven10
Posts: 4292
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 7 times
Been thanked: 217 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: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

Вопросы по использованию 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 чат
Post Reply

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