Page 1 of 1

Вопрос по FCTL_CLOSEPANEL

Posted: Sat 21 Jul, 2018 20:57
by Shmuel
Ситуация такова (все действия производятся в одном макросе, ничего вручную):
1. Cоздаём файл базы данных sqlite3.
2. Открываем его плагином Polygon (с помощью Plugin.Command или Plugin.Call).
3. Вызываем FCTL_CLOSEPANEL. При этом должен произойти вызов ClosePanelW() плагина, который закроет соединение с базой данных.
4. Пытаемся удалить этот файл с помощью win.DeleteFile() - обламываемся, файл залочен.

Проверка показывает, что ClosePanelW() не вызывается синхронно внутри FCTL_CLOSEPANEL, а вызывается "отложенно": либо когда макрос закончится, либо при выводе на экран диалога.

Данное поведение вроде не документировано (и я о нём не знал до сегодняшнего дня). Есть ли в таком поведении необходимость?
Я бы предпочёл, чтобы ClosePanelW() вызывалась "синхронно".

Вопрос по FCTL_CLOSEPANEL

Posted: Sun 22 Jul, 2018 14:15
by zg
так было ещё в 1.64. 5242.

Вопрос по FCTL_CLOSEPANEL

Posted: Sun 22 Jul, 2018 14:56
by Shmuel
Спасибо, теперь тест заработал. Интересно только, не сломается ли что-то другое из-за этого :)

Вопрос по FCTL_CLOSEPANEL

Posted: Mon 23 Jul, 2018 09:21
by DrKnS
Сломался как минимум переход по папкам через DiskMenu.dll.

FreeFindData пытается дереференсить нулевой hPlugin:

Code: Select all

 	Far.exe!movable<void *,0>::operator void *() Line 60
 	Far.exe!plugin_panel::panel() Line 105
>	Far.exe!PluginManager::FreeFindData(const plugin_panel * hPlugin=0x0000000000000000, PluginPanelItem * PanelItem=0x0000000000000000, unsigned __int64 ItemsNumber=0, bool FreeUserData=false) Line 931
 	Far.exe!FileList::UpdatePlugin(int KeepSelection=0, int UpdateEvenIfPanelInvisible=0) Line 7045
 	Far.exe!FileList::Update(int Mode=0) Line 6341
 	Far.exe!FileList::DisplayObject() Line 7211
 	Far.exe!SimpleScreenObject::Show() Line 86
 	Far.exe!ScreenObject::Show() Line 129
 	Far.exe!Panel::Show() Line 822
 	Far.exe!ChangeDiskMenu(std::shared_ptr<Panel> Owner={...}, int Pos=3, bool FirstCall=true) Line 1258
 	Far.exe!ChangeDisk(std::shared_ptr<Panel> Owner={...}) Line 1279

Вопрос по FCTL_CLOSEPANEL

Posted: Mon 23 Jul, 2018 09:31
by Shmuel
А вот так почему-то работает.

Вопрос по FCTL_CLOSEPANEL

Posted: Mon 23 Jul, 2018 09:47
by DrKnS
Shmuel wrote:
Mon 23 Jul, 2018 09:31
А вот так почему-то работает.
Плагин переходит, создавая панель и сразу же закрывая её в GetFindData через FCTL_CLOSEPANEL с указанием пути.

Вопрос по FCTL_CLOSEPANEL

Posted: Mon 23 Jul, 2018 10:11
by zg
DrKnS wrote:
Mon 23 Jul, 2018 09:21
Сломался как минимум переход по папкам через DiskMenu.dll.
FreeFindData пытается дереференсить нулевой hPlugin:
я думаю, это проблема в фаре, потому что раньше асинхронность была условно до первого диалога или FCTL_UPDATEPANEL.

Вопрос по FCTL_CLOSEPANEL

Posted: Mon 23 Jul, 2018 23:00
by zg
5245.