Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13855
- 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
Re: Вопросы по использованию FFI
Latest post of the previous page:
Помогите найти ошибку: Выдает:Описание http://msdn.microsoft.com/en-us/library ... 85%29.aspx12: cannot resolve symbol 'GetFullPathName': The specified
procedure could not be found.♪
Last edited by Guest on Tue 06 May, 2014 11:02, edited 1 time in total.
Reason: [codebox=lua file=untitled.lua]
Reason: [codebox=lua file=untitled.lua]
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Re: Вопросы по использованию FFI
посмотрите внимательно на то, что экспортирует kernel32.dll. там нет GetFullPathName.gotar wrote:Выдает:12: cannot resolve symbol 'GetFullPathName': The specified
procedure could not be found.♪
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Re: Вопросы по использованию FFI
Ошибка, прежде всего, в том, что использовать GetFullPathName(".") и другие функции из kernel32 для получения "текущего каталога" в контексте Far нельзя.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Если почитать статью MSDN внимательнее, и заметите что есть 2 разных функции:GetFullPathNameA и GetFullPathNameWgotar wrote:Помогите найти ошибку:[...]
Ну и грузить Kernel32 нет нужды, она по умолчанию загружена.
А если уж грузите, то обращаться к её функциям следует иначе:
Code: Select all
local kernel32 = ffi.load("kernel32")
...
kernel32.GetFullPathNameW(".", 4096,buf,0)
Как правильно сформировать буфер - обсуждалось в теме, начиная с первой страницы.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
А погуглить?gotar wrote:Если я открываю файл из lua( плагина и т.п) и в имени файла нет полного пути, в каком каталоге он будет искаться?
http://msdn.microsoft.com/library/aa364934
P.S.
Вообще ffi это (по определению) сложно для неподготовленного пользователя.
Проще будет воспользоваться какой-нибудь lua-библиотекой, например lfs или ex.
Можно исхитриться и без внешних библиотек, обрабатывая вывод команд, запущенных по io.popen.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Re: Вопросы по использованию FFI
В текущем каталоге процесса, как вам уже ответили.gotar wrote:Если я открываю файл из lua( плагина и т.п) и в имени файла нет полного пути, в каком каталоге он будет искаться?
Но особенность в том, что он совершенно не обязательно совпадает с тем, что на панели и может указывать куда попало.
http://api.farmanager.com/ru/fsf/getcur ... ctory.html
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Если всё, что нужно узнать, это текущая папка, то можно обойтись без FFI. В зависимости от того, что вам надо, можно выбрать одну из 2-х ф-ций луафара:
1. far.GetCurrentDirectory
2. panel.GetPanelDirectory
1. far.GetCurrentDirectory
2. panel.GetPanelDirectory
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
В данной теме это оффтопик, не говоря уже о том, что быстрее проверить а не спрашивать.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?TOKEN_PRIVILEGES structure wrote:[...]
Important The constant ANYSIZE_ARRAY is defined as 1 in the public header Winnt.h. To create this array with more than one element, you must allocate sufficient memory for the structure to take into account additional elements.
- Если следовать буквально, то как я понимаю надо вычислить размер структуры с учётом реального размера массива, выделить под неё память, и привести к нужному типу:
- С другой стороны, в ffi есть ведь специальные средства.
Я ничего не упускаю?
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
В первом случае размер известен (ANYSIZE_ARRAY==1)
Во втором ffi.sizeof не используется Да и вообще,
Во втором ffi.sizeof не используется Да и вообще,
ffi.sizeof("TOKEN_PRIVILEGES")
не используется ни в одном из премеров выше- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Code: Select all
local struct = ffi.new("char[?]",size)
struct = ffi.cast("TOKEN_PRIVILEGES *",struct)
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Я не просто так предлагаю это обсудить.John Doe wrote:Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?
Невозможно переопределить уже объявленный тип, ffi не даёт.
Если будет 2 скрипта с разными определениями, то один из них поломается.
Было бы неплохо договориться о совместимом способе.
Предлагаю в качестве
ANYSIZE_ARRAY
всегда использовать ?
.