Page 13 of 14

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

Posted: Tue 21 May, 2013 20:20
by John Doe
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI

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

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

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

Posted: Fri 11 May, 2018 09:04
by buniak_a_h

Latest post of the previous page:

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

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

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

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

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

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

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

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

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

Posted: Fri 11 May, 2018 10:00
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).

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

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

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

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

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

Posted: Fri 11 May, 2018 10:23
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.
в официальной документации и почитать, ссылку на которую вы сами приводите.

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

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

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

Posted: Fri 11 May, 2018 11:18
by buniak_a_h

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

Posted: Fri 11 May, 2018 11:40
by Shmuel

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

Posted: Fri 11 May, 2018 11:47
by buniak_a_h

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

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

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

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

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

Posted: Sat 12 May, 2018 13:27
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

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

Posted: Sat 12 May, 2018 13:45
by 2useven10
John Doe wrote:
Sat 12 May, 2018 13:27
А надо было сильнее поправлять.
Так сильно совсем не надо.
Если бы вы были более внимательны, то заметили бы, что пост правился 2 раза, и то что там есть сейчас работает.
Собственно падение было из-за опечатки в строке: far.Show(ffi.C.CopyFileW(inPathW, outPathWA, 1))
Если бы это был не FFI, ошибка была бы диагностирована до падения.

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

Posted: Sat 12 May, 2018 13:54
by John Doe
2useven10 wrote:
Sat 12 May, 2018 13:45
Если бы вы были более внимательны, то заметили бы, что пост правился 2 раза, и то что там есть сейчас работает.
Я следую логике обсуждения, ведь ниже вы нигде не сообщили о том, что исправили это.
Но да, сейчас код в порядке, и мало отличается от моего (отличие в том, что преобразование строки я убрал в функцию)