Вопрос по FCTL_CLOSEPANEL

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

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel » Sat 21 Jul, 2018 20:57

Ситуация такова (все действия производятся в одном макросе, ничего вручную):
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: 5485
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 71 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg » Sun 22 Jul, 2018 14:15

так было ещё в 1.64. 5242.

Shmuel
Posts: 5480
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 20 times
Been thanked: 176 times

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel » Sun 22 Jul, 2018 14:56

Спасибо, теперь тест заработал. Интересно только, не сломается ли что-то другое из-за этого :)

User avatar
DrKnS
Posts: 4893
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 159 times

Вопрос по FCTL_CLOSEPANEL

Post by DrKnS » Mon 23 Jul, 2018 09:21

Сломался как минимум переход по папкам через 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: 5480
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 20 times
Been thanked: 176 times

Вопрос по FCTL_CLOSEPANEL

Post by Shmuel » Mon 23 Jul, 2018 09:31

А вот так почему-то работает.

User avatar
DrKnS
Posts: 4893
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 159 times

Вопрос по FCTL_CLOSEPANEL

Post by DrKnS » Mon 23 Jul, 2018 09:47

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

User avatar
zg
zero-gravity
Posts: 5485
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 71 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg » Mon 23 Jul, 2018 10:11

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

User avatar
zg
zero-gravity
Posts: 5485
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 71 times
Contact:

Вопрос по FCTL_CLOSEPANEL

Post by zg » Mon 23 Jul, 2018 23:00

5245.

Post Reply

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