Ситуация такова (все действия производятся в одном макросе, ничего вручную):
1. Cоздаём файл базы данных sqlite3.
2. Открываем его плагином Polygon (с помощью Plugin.Command или Plugin.Call).
3. Вызываем FCTL_CLOSEPANEL. При этом должен произойти вызов ClosePanelW() плагина, который закроет соединение с базой данных.
4. Пытаемся удалить этот файл с помощью win.DeleteFile() - обламываемся, файл залочен.
Проверка показывает, что ClosePanelW() не вызывается синхронно внутри FCTL_CLOSEPANEL, а вызывается "отложенно": либо когда макрос закончится, либо при выводе на экран диалога.
Данное поведение вроде не документировано (и я о нём не знал до сегодняшнего дня). Есть ли в таком поведении необходимость?
Я бы предпочёл, чтобы ClosePanelW() вызывалась "синхронно".
Вопрос по FCTL_CLOSEPANEL
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Вопрос по FCTL_CLOSEPANEL
Сломался как минимум переход по папкам через DiskMenu.dll.
FreeFindData пытается дереференсить нулевой hPlugin:
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
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Вопрос по FCTL_CLOSEPANEL
Плагин переходит, создавая панель и сразу же закрывая её в GetFindData через FCTL_CLOSEPANEL с указанием пути.
- zg
- zero-gravity
- Posts: 6016
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопрос по FCTL_CLOSEPANEL
я думаю, это проблема в фаре, потому что раньше асинхронность была условно до первого диалога или FCTL_UPDATEPANEL.