Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
-
- Posts: 6834
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Latest post of the previous page:
Документация по FFI (как и многие другие мануалы для программистов) предполагает определённый уровень подготовки читающего.buniak_a_h wrote: ↑Fri 11 May, 2018 09:26 Я догадался, что ffi.cast - это нечто типа приведения типа. Но как узнать, когда оно нужно, а когда - нет, этот сайт не разъясняет.
Как на мой взгляд, документация по FFI на сайте LuaJIT очень качественная.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
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.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Это winapi а не lua.buniak_a_h wrote: ↑Fri 11 May, 2018 10:00 и что подразумевается под константами типа LPCTSTR (LPCSTR либо LPCWSTR).
И "определённый уровень подготовки" предполагает не то, что вы это знаете наизусть, а то, что способны разобраться в предоставленной документации.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
Понятно. Спасибо за квалифицированную помощь. Теперь я знаю, что я - неуч и дурак.
Ладно, обойдусь.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопросы по использованию FFI
buniak_a_h wrote: ↑Fri 11 May, 2018 09:04Если б Вы ещё написали, что такое ffi.cast (ну или хотя бы где про него прочитать)...
в официальной документации и почитать, ссылку на которую вы сами приводите.
-
- Posts: 6834
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Зачем так драматизировать? У каждого есть свой уровень подготовки. Программирование на FFI требует достаточно высокого уровня (например, в СИ), возможно у вас недостаточный. Я, к примеру, обращаюсь к FFI нечасто, только если другие варианты решения заметно хуже.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
Last edited by HaRT on Fri 11 May, 2018 12:17, edited 2 times in total.
Reason: Спрятан офтопик
Reason: Спрятан офтопик
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
Last edited by HaRT on Fri 11 May, 2018 12:15, edited 1 time in total.
Reason: Спрятан офтопик
Reason: Спрятан офтопик
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.buniak_a_h wrote: ↑Fri 11 May, 2018 11:47 Т.е. если я, программист, неспособен разобраться в документации[...]
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
John Doe wrote: ↑Fri 11 May, 2018 14:34Если вы внимательно почитаете, то возможно обнаружите, что никто такого не утверждал.buniak_a_h wrote: ↑Fri 11 May, 2018 11:47 Т.е. если я, программист, неспособен разобраться в документации[...]
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
А надо было сильнее поправлять.
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
Так сильно совсем не надо.
Если бы вы были более внимательны, то заметили бы, что пост правился 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.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Я следую логике обсуждения, ведь ниже вы нигде не сообщили о том, что исправили это.
Но да, сейчас код в порядке, и мало отличается от моего (отличие в том, что преобразование строки я убрал в функцию)
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
Reason: исправлена ссылка, было: https://forum.farmanager.com/viewtopic.php?p=149506#p149506
Вопросы по использованию FFI
В посте, на который вы ссылаетесь, buniak_a_h, опечатку уже исправил о чём он собственно и пишет.
Last edited by 2useven10 on Sat 12 May, 2018 15:19, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
Вы правы, оказывается я руководствовался вашим первым ошибочным вариантом, и проглядел, что позже код был исправлен.
И раз всё работает, то я перестал понимать из-за чего вообще скандал разгорелся..
И раз всё работает, то я перестал понимать из-за чего вообще скандал разгорелся..