[BROWSEUI][SHELL32] Ignore navigation requests during browser destruction (#7161)

PR #7141 causes calls to IShellBrowser::BrowseObject while the shell browser is in the middle of destruction and the ShellView ListView has already been destroyed and DefView is not prepared for this.
This commit is contained in:
Whindmar Saksit 2024-07-22 21:25:58 +02:00 committed by GitHub
parent f6a25d48d5
commit 6219a1abe5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 9 additions and 2 deletions

View file

@ -308,6 +308,7 @@ private:
ShellSettings m_settings;
SBFOLDERSETTINGS m_deffoldersettings;
DWORD m_BrowserSvcFlags;
bool m_Destroyed;
public:
#if 0
ULONG InternalAddRef()
@ -728,6 +729,7 @@ extern HRESULT CreateProgressDialog(REFIID riid, void **ppv);
CShellBrowser::CShellBrowser()
{
m_BrowserSvcFlags = BSF_RESIZABLE | BSF_CANMAXIMIZE;
m_Destroyed = false;
fCurrentShellViewWindow = NULL;
fCurrentDirectoryPIDL = NULL;
fStatusBar = NULL;
@ -1022,6 +1024,9 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder,
HRESULT hResult;
//TODO: BOOL nohistory = m_BrowserSvcFlags & BSF_NAVNOHISTORY;
if (m_Destroyed)
return S_FALSE;
if (newShellFolder == NULL)
return E_INVALIDARG;
@ -3619,15 +3624,15 @@ LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
HRESULT hr;
SaveViewState();
/* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
OleFlushClipboard();
// TODO: rip down everything
{
m_Destroyed = true; // Ignore browse requests from Explorer band TreeView during destruction
fToolbarProxy.Destroy();
SaveViewState();
fCurrentShellView->DestroyViewWindow();
fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);

View file

@ -3227,6 +3227,8 @@ HRESULT CDefView::LoadViewState()
HRESULT CDefView::SaveViewState(IStream *pStream)
{
if (!m_ListView.m_hWnd)
return E_UNEXPECTED;
int sortcol = MapListColumnToFolderColumn(m_sortInfo.ListColumn);
PERSISTCLASSICVIEWSTATE cvs;
cvs.SortColId = sortcol >= 0 ? (WORD)sortcol : 0;