far.GetPluginDirList падает Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

far.GetPluginDirList падает

Post by buniak_a_h »

Есть две похожие функции: far.GetPluginDirList и far.Host.GetFindData. Обе функции принимают хендл панели.
На активной панели открыт архив в ArvLite.
Вот такой скрипт работает:

Code: Select all

local handle = panel.GetPanelInfo(nil, 1).PluginHandle
local list = far.Host.GetFindData(handle)
Вроде бы аналогичный скрипт

Code: Select all

local handle = panel.GetPanelInfo(nil, 1).PluginHandle
local list = far.GetPluginDirList(handle, APanel.Path)
Приводит к вылету:
╔════════════════════════════════════════════════════════════ Error ═════════════════════════════════════════════════════════════╗ ║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll: ║ ║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua:583: attempt to index local 'wrapped_obj' (a nil value) ║ ║ stack traceback: ║ ║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua:583: in function <C:\Program Files\Far Manager\Plugins\LuaMacro\ ║ ║ LuaMacro.lua:582> ║ ║ [C]: in function 'co_resume' ║ ║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua:241: in function 'MacroStep' ║ ║ C:\Program Files\Far Manager\Plugins\LuaMacro\keymacro.lua:288: in function <C:\Program Files\Far Manager\Plugins\LuaMacro\ ║ ║ keymacro.lua:248> ║ ╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ { OK } ║ ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
ЧЯДНТ?
Last edited by buniak_a_h on Wed 27 Oct, 2021 17:29, edited 1 time in total.
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

far.GetPluginDirList падает

Post by Shmuel »

Насколько я понимаю:
  • Строка 583 в LuaMacro.lua принадлежит функции export.GetOpenPanelInfo.
  • Это значит, что Фар вызвал функцию GetOpenPanelInfoW плагина LuaMacro.
  • Фар не должен был этого делать, поскольку панель принадлежит другому плагину.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

far.GetPluginDirList падает

Post by buniak_a_h »

Shmuel, я что-то в скрипте неправильно написал?
Переменная handle формируется одинаково в обоих скриптах; однако в функции far.Host.GetFindData всё работает. Ошибка в реализации far.GetPluginDirList?
Замечу ещё, что если активная панель - не плагиновая, но вылета не происходит, просто list == nil .
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

far.GetPluginDirList падает

Post by Shmuel »

buniak_a_h wrote: Wed 27 Oct, 2021 22:31 я что-то в скрипте неправильно написал?
Из моего ответа это не следует.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

far.GetPluginDirList падает

Post by buniak_a_h »

Shmuel wrote: Wed 27 Oct, 2021 22:54 Из моего ответа это не следует.
А, т.е. я ошибку нашёл? Надо куда-то написать?
Просто вряд ли так и было задумано…
Last edited by buniak_a_h on Wed 27 Oct, 2021 23:14, edited 1 time in total.
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

far.GetPluginDirList падает

Post by Shmuel »

Зачем ещё куда-то писать, когда уже здесь всё написано.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

far.GetPluginDirList падает

Post by John Doe »

https://api.farmanager.com/ru/service_functions/getplugindirlist.html wrote:PluginId
Указатель на GUID плагина (для вашего плагина, GUID должен быть таким же, что и в поле GlobalInfo.Guid функции GetGlobalInfoW).
В luafar api этого параметра нет вообще, и я подозреваю что вместо него всегда передаётся собственный гуид LuaMacro.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

far.GetPluginDirList падает

Post by buniak_a_h »

John Doe, я не понял, к чему это.
Статья, посвященная far.GetPluginDirList в luafar_manual:
%FarHome%\Encyclopedia\luafar_manual:60.html wrote: list = far.GetPluginDirList (handle, Dir)

Parameters:
handle: panel handle, or nil
Dir: string
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

far.GetPluginDirList падает

Post by buniak_a_h »

John Doe, P/S.
Как получить panel handle, я не нашёл. Зато я нашёл описание функции far.Host.GetFindData:
file://%FarHome%\Encyclopedia\luafar_manual:555.html wrote: Items = far.Host.GetFindData (handle [, OpMode])

Parameters:
handle: panel handle
OpMode: flags (default = OPM_FIND|OPM_SILENT)
и в примере использования я нашёл, как получить хендл панели и в far.Host.GetFindData это работает. Хотя это странно:
handle = panel.GetPanelInfo(nil, 1).PluginHandle
предполагает, что хендл есть только у плагиновых панелей. А у не-плагиновых, что, хендла нету?
2useven10
Posts: 5226
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 314 times

far.GetPluginDirList падает

Post by 2useven10 »

buniak_a_h wrote: Thu 28 Oct, 2021 11:44 handle = panel.GetPanelInfo(nil, 1).PluginHandle
попробуйте так: handle = far.FindPlugin(PFM_GUID, panel.GetPanelInfo(nil, 1).OwnerGuid)
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

far.GetPluginDirList падает

Post by John Doe »

2useven10 wrote: Thu 28 Oct, 2021 13:23 попробуйте так: handle = far.FindPlugin(PFM_GUID, panel.GetPanelInfo(nil, 1).OwnerGuid)
bad argument #1 to 'GetPluginDirList' (integer or light userdata expected, got userdata)
buniak_a_h wrote: Thu 28 Oct, 2021 11:44 хендл есть только у плагиновых панелей. А у не-плагиновых, что, хендла нету?
Нету, и реально не хватает для некоторых сценариев.
Но во многих случаях можно обойтись константами PANEL_ACTIVE / PANEL_PASSIVE.
Они кстати работают и для плагиновых панелей, и даже не роняют GetPluginDirList.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

far.GetPluginDirList падает

Post by John Doe »

buniak_a_h wrote: Thu 28 Oct, 2021 10:58 я не понял, к чему это.
К тому что (по моему предположению) ошибка в библиотеке - не реализована передача параметра.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

far.GetPluginDirList падает

Post by Shmuel »

https://api.farmanager.com/ru/service_functions/getplugindirlist.html wrote:PluginId
Указатель на GUID плагина (для вашего плагина, GUID должен быть таким же, что и в поле GlobalInfo.Guid функции GetGlobalInfoW).
  1. Данная фраза в энциклопедии скопипащена для десятков функций. Из неё не следует, что для GetPluginDirList должен быть передан именно гуид плагина-хозяина панели.
  2. Фар знает гуид хозяина панели, если у него есть хэндл. Он выдаёт этот гуид по запросу FCTL_GETPANELINFO в поле OwnerGuid. То есть, если Фару передан хэндл панели, он уже имеет всю необходимую информацию.
  3. Я мог бы сделать патч для Far.exe, но времени на это нет. Думаю, что для Far Group это несложно сделать.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

far.GetPluginDirList падает

Post by John Doe »

Shmuel wrote: Thu 28 Oct, 2021 13:53 Данная фраза в энциклопедии скопипащена для десятков функций.
И верно.
В таком контексте становится не так очевидно что туда передавать).
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

far.GetPluginDirList падает

Post by Shmuel »

Вот такой патч похоже решает проблему.
patch.diff
(663 Bytes) Downloaded 129 times
Post Reply

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