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

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

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

Post by John Doe » Tue 21 May, 2013 20:20

FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI

Примеры готовых скриптов:

Предупреждение: viewtopic.php?p=147610#p147610

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sun 02 Mar, 2014 21:40

Latest post of the previous page:

Спасибо, так отлично.

Пытаясь углубиться далее понял что документация FFI слишком лаконична, хотя много информации можно выудить из рассылки.

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sun 02 Mar, 2014 21:57

Shmuel wrote:
John Doe wrote:Возможно ли через ffi как-то воспользоваться C-функциями far api?
Да, для этого даже добавлен файл LuaMacro\farapi.lua.
Также в комплекте есть winapi.lua, в связи с чем возникло несколько вопросов по использованию специфических типов данных winapi.
При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.

Меня интересует какой из путей предпочтительнее?

(В winapi.lua определены слишком малая их часть)

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sun 02 Mar, 2014 22:01

Также интересует вопрос как лучше определять C-константы.
Например верно ли это:

Code: Select all

local STD_OUTPUT_HANDLE = ffi.new("unsigned long",-11)
local INVALID_HANDLE_VALUE = ffi.cast("void*",-1)

Shmuel
Posts: 5740
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 204 times

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

Post by Shmuel » Sun 02 Mar, 2014 22:14

John Doe wrote:При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.

Меня интересует какой из путей предпочтительнее?

(В winapi.lua определены слишком малая их часть)
1. Оба пути равнозначны, предпочтительность того или иного зависит от разных факторов.
2. "Малая часть" - в основном то, что нужно для farapi.lua.
John Doe wrote:Также интересует вопрос как лучше определять C-константы.
Например верно ли это:

Code: Select all

local STD_OUTPUT_HANDLE = ffi.new("unsigned long",-11)
local INVALID_HANDLE_VALUE = ffi.cast("void*",-1)
Посмотрите в farapi.lua, там определена куча констант.
Пока есть проблема только с 64-битными константами, их действительно приходится определять вне ffi.cdef, но для этого не надо ffi.new, просто можно определить MY_CONST=123LL.

Для STD_OUTPUT_HANDLE можно
ffi.cdef "static const unsigned long STD_OUTPUT_HANDLE = -11;"

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sun 02 Mar, 2014 22:34

Shmuel wrote:Посмотрите в farapi.lua, там определена куча констант.
Поначалу я не понял как использовать определённые таким образом константы, но методом тыка получилось через индексацию ffi.C. Или можно иначе?
И как правильно проверить что константа уже была определена (чтобы избежать проблемы при попытке "переопределения" константы)?

Shmuel
Posts: 5740
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 204 times

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

Post by Shmuel » Sun 02 Mar, 2014 22:37

1. Нельзя иначе.
2. pcall(ffi.cdef, arg). Есть и другие способы, см. в коде макросов zg.

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Mon 03 Mar, 2014 00:58

Shmuel wrote:2. pcall(ffi.cdef, arg). Есть и другие способы, см. в коде макросов zg.
В picture.lua используется safe_cdef
Для безопасного определения констант можно использовать нечто подобное:
  1. local function safe_const(typename,name,val)
  2.   if not pcall(function(const)return ffi.C[const] end,name) then
  3.     ffi.cdef(([[static const %s %s = %s;]]):format(typename,name,val))
  4.   end
  5. end
Использовать как safe_const("ULONG","SEE_MASK_NOCLOSEPROCESS","0x00000040")

P.S.
Всё-таки как же определить константу-указатель?
Вот это вызывает invalid C type

Shmuel
Posts: 5740
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 204 times

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

Post by Shmuel » Mon 03 Mar, 2014 07:07

John Doe wrote:Всё-таки как же определить константу-указатель?
Так, как сделано здесь (для INVALID_HANDLE_VALUE).

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Mon 03 Mar, 2014 15:45

Shmuel wrote:
John Doe wrote:При определении C-функций нельзя просто так взять её описание на MSDN, нужно ещё заменить Windows-типы данных на стандартные, либо предварительно определить нужные типы.
1. Оба пути равнозначны, предпочтительность того или иного зависит от разных факторов.
Вообще кажется удобным использовать в определениях функций именно Windows data types.
Однако необходимость их дефиниции, плюс защита от редефиниции сильно снижают это удобство.

Раз уж у нас есть winapi.lua, может быть стоит определить там основные типы? http://msdn.microsoft.com/library/aa383751

Shmuel
Posts: 5740
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 204 times

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

Post by Shmuel » Mon 03 Mar, 2014 15:58

Делайте патч.

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Mon 03 Mar, 2014 19:15

Попалось два варианта
https://github.com/luapower/winapi/blob ... ntypes.lua
https://github.com/Wiladams/LJIT2Win32/ ... WTypes.lua

Или просто код собранный в той статье MSDN
Хотя... в алфавитном порядке оно бесполезно, проще взять исходник (BaseTsd.h;WinDef.h;WinNT.h)

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Mon 03 Mar, 2014 21:28

В общем, чтобы сделать годный патч надо разбираться в C побольше чем я.
Так что оставляю на ваше усмотрение.

Shmuel
Posts: 5740
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 204 times

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

Post by Shmuel » Mon 03 Mar, 2014 23:46

John Doe wrote:Так что оставляю на ваше усмотрение.
Тут дело не в усмотрении, а во времени, которое не всегда есть.
Заводите тикет на мантисе, может у кого-нибудь когда-нибудь руки дойдут.

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Thu 06 Mar, 2014 21:39

Сделал сам, сверив по MSDN содержимое указанных заголовочных файлов.
Лишнее убрал, недостающее добавил.

Строки, конфликтующие с текущим содержимым winapi.lua закомментированы.
Строки 95 и 99 надо уточнить, т.к. я не уверен что значит !defined(_M_IX86)

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Fri 07 Mar, 2014 12:25


User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sat 08 Mar, 2014 11:13

Code: Select all

shmuel 08.03.2014 00:08:20 +0200 - build 297

1. Уточнение build 296.

shmuel 07.03.2014 22:30:54 +0200 - build 296

1. Расширение winapi.lua (от John Doe).

User avatar
John Doe
Бюрократ
Posts: 12250
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Sat 08 Mar, 2014 11:16

Смотрю farapi.lua, и вижу что в определениях констант вместо специфических типов Far API используются стандартные.

Code: Select all

static const /*COLORDIALOGFLAGS*/ uint32_t
    CDF_NONE = 0;
Для чего это сделано?

Post Reply

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