Вопрос по FCTL_CLOSEPANEL

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel »

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

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

Данное поведение вроде не документировано (и я о нём не знал до сегодняшнего дня). Есть ли в таком поведении необходимость?
Я бы предпочёл, чтобы ClosePanelW() вызывалась "синхронно".
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg »

так было ещё в 1.64. 5242.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel »

Спасибо, теперь тест заработал. Интересно только, не сломается ли что-то другое из-за этого :)
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Вопрос по FCTL_CLOSEPANEL

Post 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
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel »

А вот так почему-то работает.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Вопрос по FCTL_CLOSEPANEL

Post by DrKnS »

Shmuel wrote: Mon 23 Jul, 2018 09:31 А вот так почему-то работает.
Плагин переходит, создавая панель и сразу же закрывая её в GetFindData через FCTL_CLOSEPANEL с указанием пути.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg »

DrKnS wrote: Mon 23 Jul, 2018 09:21Сломался как минимум переход по папкам через DiskMenu.dll.
FreeFindData пытается дереференсить нулевой hPlugin:
я думаю, это проблема в фаре, потому что раньше асинхронность была условно до первого диалога или FCTL_UPDATEPANEL.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg »

5245.
Post Reply

Return to “Разработка плагинов”