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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 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
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Latest post of the previous page:

buniak_a_h wrote: Fri 11 May, 2018 09:26 Я догадался, что ffi.cast - это нечто типа приведения типа. Но как узнать, когда оно нужно, а когда - нет, этот сайт не разъясняет.
Документация по FFI (как и многие другие мануалы для программистов) предполагает определённый уровень подготовки читающего.
Как на мой взгляд, документация по FFI на сайте LuaJIT очень качественная.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

Shmuel wrote: Fri 11 May, 2018 09:31 Документация по FFI (как и многие другие мануалы для программистов) предполагает определённый уровень подготовки читающего.
Как на мой взгляд, документация по FFI на сайте LuaJIT очень качественная.
1. Я на СИ реально писал последний раз году этак в 93-м. Не считая переделок библиотеки Apollo (доступ к БД из Delphi). Но и в то время, и в библиотеке Apollo не было проблем с юникодом. Думаю, программисты, имеющие «определённый уровень подготовки», вопросов на этом форуме не задают.
2. Конкретно для решения этого вопроса собственно подготовки (знания СИ) недостаточно. Надо ещё знать "внутреннюю кухню" LUA. В данном случае - как хранятся и передаются в ffi строки и что подразумевается под константами типа LPCTSTR (LPCSTR либо LPCWSTR).
Last edited by buniak_a_h on Fri 11 May, 2018 10:01, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: Fri 11 May, 2018 10:00 и что подразумевается под константами типа LPCTSTR (LPCSTR либо LPCWSTR).
Это winapi а не lua.
И "определённый уровень подготовки" предполагает не то, что вы это знаете наизусть, а то, что способны разобраться в предоставленной документации.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: Fri 11 May, 2018 10:03 способны разобраться.
Понятно. Спасибо за квалифицированную помощь. Теперь я знаю, что я - неуч и дурак.
Ладно, обойдусь.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

buniak_a_h wrote: Fri 11 May, 2018 09:04Если б Вы ещё написали, что такое ffi.cast (ну или хотя бы где про него прочитать)...
buniak_a_h wrote: Fri 11 May, 2018 08:37Пример с MessageBoxA взят из FFI Library.
в официальной документации и почитать, ссылку на которую вы сами приводите.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

buniak_a_h wrote: Fri 11 May, 2018 10:07 Теперь я знаю, что я - неуч и дурак.
Зачем так драматизировать? У каждого есть свой уровень подготовки. Программирование на FFI требует достаточно высокого уровня (например, в СИ), возможно у вас недостаточный. Я, к примеру, обращаюсь к FFI нечасто, только если другие варианты решения заметно хуже.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

Last edited by HaRT on Fri 11 May, 2018 12:17, edited 2 times in total.
Reason: Спрятан офтопик
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Last edited by HaRT on Fri 11 May, 2018 12:17, edited 1 time in total.
Reason: Спрятан офтопик
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

Last edited by HaRT on Fri 11 May, 2018 12:15, edited 1 time in total.
Reason: Спрятан офтопик
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: Fri 11 May, 2018 11:47 Т.е. если я, программист, неспособен разобраться в документации[...]
Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: Fri 11 May, 2018 14:34
buniak_a_h wrote: Fri 11 May, 2018 11:47 Т.е. если я, программист, неспособен разобраться в документации[...]
Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

2useven10 wrote: Fri 11 May, 2018 08:04 у меня работает. (немного поправил)
А надо было сильнее поправлять.

Code: Select all

local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
BOOL CopyFileW(
  LPCTSTR ExistingFileName,
  LPCTSTR NewFileName,
  BOOL    bFailIfExists
);
]]

local function _wchar(str)
  str = win.Utf8ToUtf16(str).."\0"
  return ffi.cast("void*",str)
end

--[[ можно и без ffi.cast
local function _wchar(str)
  str = win.Utf8ToUtf16(str)
  local buffer = ffi.new("wchar_t[?]",#str/2+1)
  ffi.copy(buffer,str)
  return buffer
end
--]]

local curdir = far.GetCurrentDirectory().."\\"
local inPath = curdir.."test"
local outPath = curdir.."test.out"
if win.GetFileAttr(outPath) then win.DeleteFile(outPath) end
far.Show(C.CopyFileW(_wchar(inPath), _wchar(outPath), 1))

-- MessageBox не иллюстрирую, так как уже был в теме:
-- https://forum.farmanager.com/viewtopic.php?p=115224#p115224
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

John Doe wrote: Sat 12 May, 2018 13:27 А надо было сильнее поправлять.
Так сильно совсем не надо.
Если бы вы были более внимательны, то заметили бы, что пост правился 2 раза, и то что там есть сейчас работает.
Собственно падение было из-за опечатки в строке: far.Show(ffi.C.CopyFileW(inPathW, outPathWA, 1))
Если бы это был не FFI, ошибка была бы диагностирована до падения.
Last edited by 2useven10 on Sat 12 May, 2018 13:46, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

2useven10 wrote: Sat 12 May, 2018 13:45 Если бы вы были более внимательны, то заметили бы, что пост правился 2 раза, и то что там есть сейчас работает.
Я следую логике обсуждения, ведь ниже вы нигде не сообщили о том, что исправили это.
Но да, сейчас код в порядке, и мало отличается от моего (отличие в том, что преобразование строки я убрал в функцию)
Last edited by John Doe on Sat 12 May, 2018 14:38, edited 2 times in total.
Reason: исправлена ссылка, было: https://forum.farmanager.com/viewtopic.php?p=149506#p149506
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

John Doe wrote: Sat 12 May, 2018 13:54 Я следую логике обсуждения, ведь ниже вы нигде не сообщили о том, что исправили это.
В посте, на который вы ссылаетесь, buniak_a_h, опечатку уже исправил о чём он собственно и пишет.
Last edited by 2useven10 on Sat 12 May, 2018 15:19, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Вы правы, оказывается я руководствовался вашим первым ошибочным вариантом, и проглядел, что позже код был исправлен.

И раз всё работает, то я перестал понимать из-за чего вообще скандал разгорелся..
Post Reply

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