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

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

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

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

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

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

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

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 09:04

Latest post of the previous page:

2useven10 wrote:
Fri 11 May, 2018 08:58
да, если дело доходит до копирования у меня так же падает...

Если б Вы ещё написали, что такое ffi.cast (ну или хотя бы где про него прочитать)... А то повторяю как попугай... :-(

Shmuel
Posts: 5836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 times

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

Post by Shmuel » Fri 11 May, 2018 09:06

buniak_a_h wrote:
Fri 11 May, 2018 09:04
Если б Вы ещё написали, что такое ffi.cast (ну или хотя бы где про него прочитать
Ну есть же сайт luajit, там вся документация по FFI.

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 09:26

Shmuel wrote:
Fri 11 May, 2018 09:06
Ну есть же сайт luajit, там вся документация по FFI.
Ну вот как раз с этого сайта я и брал не-юникодный пример MessageBoxA. И, кстати, в этом примере ffi.cast НЕ БЫЛО! А работало прекрасно. Хотя именно в том примере я был уверен, что требуется преобразование типа - ведь раз интерпретатор работает с юникодными строками, то по логике и адрес должен указывать именно на юникодную строку... Но... Логика тут бессильна, просто надо запомнить... :cry:
Я догадался, что ffi.cast - это нечто типа приведения типа. Но как узнать, когда оно нужно, а когда - нет, этот сайт не разъясняет.

Shmuel
Posts: 5836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 times

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

Post by Shmuel » Fri 11 May, 2018 09:31

buniak_a_h wrote:
Fri 11 May, 2018 09:26
Я догадался, что ffi.cast - это нечто типа приведения типа. Но как узнать, когда оно нужно, а когда - нет, этот сайт не разъясняет.
Документация по FFI (как и многие другие мануалы для программистов) предполагает определённый уровень подготовки читающего.
Как на мой взгляд, документация по FFI на сайте LuaJIT очень качественная.

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 10:00

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: 12323
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 168 times

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

Post by John Doe » Fri 11 May, 2018 10:03

buniak_a_h wrote:
Fri 11 May, 2018 10:00
и что подразумевается под константами типа LPCTSTR (LPCSTR либо LPCWSTR).
Это winapi а не lua.
И "определённый уровень подготовки" предполагает не то, что вы это знаете наизусть, а то, что способны разобраться в предоставленной документации.

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 10:07

John Doe wrote:
Fri 11 May, 2018 10:03
способны разобраться.
Понятно. Спасибо за квалифицированную помощь. Теперь я знаю, что я - неуч и дурак.
Ладно, обойдусь.

User avatar
zg
zero-gravity
Posts: 5572
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 89 times
Contact:

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

Post by zg » Fri 11 May, 2018 10:23

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: 5836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 times

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

Post by Shmuel » Fri 11 May, 2018 10:35

buniak_a_h wrote:
Fri 11 May, 2018 10:07
Теперь я знаю, что я - неуч и дурак.
Зачем так драматизировать? У каждого есть свой уровень подготовки. Программирование на FFI требует достаточно высокого уровня (например, в СИ), возможно у вас недостаточный. Я, к примеру, обращаюсь к FFI нечасто, только если другие варианты решения заметно хуже.

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 11:18

Last edited by HaRT on Fri 11 May, 2018 12:17, edited 2 times in total.
Reason: Спрятан офтопик

Shmuel
Posts: 5836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 times

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

Post by Shmuel » Fri 11 May, 2018 11:40

Last edited by HaRT on Fri 11 May, 2018 12:17, edited 1 time in total.
Reason: Спрятан офтопик

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 11:47

Last edited by HaRT on Fri 11 May, 2018 12:15, edited 1 time in total.
Reason: Спрятан офтопик

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

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

Post by John Doe » Fri 11 May, 2018 14:34

buniak_a_h wrote:
Fri 11 May, 2018 11:47
Т.е. если я, программист, неспособен разобраться в документации[...]
Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.

buniak_a_h
Posts: 749
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 72 times
Been thanked: 20 times
Contact:

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

Post by buniak_a_h » Fri 11 May, 2018 14:40

John Doe wrote:
Fri 11 May, 2018 14:34
buniak_a_h wrote:
Fri 11 May, 2018 11:47
Т.е. если я, программист, неспособен разобраться в документации[...]
Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.

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

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

Post by John Doe » Sat 12 May, 2018 13:27

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: 3890
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 162 times

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

Post by 2useven10 » Sat 12 May, 2018 13:45

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: 12323
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 168 times

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

Post by John Doe » Sat 12 May, 2018 13:54

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

Post Reply

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