Module: wine Branch: master Commit: d3a034e3482637ad28dc2d36eba27d2c94b8a6ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=d3a034e3482637ad28dc2d36eb...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Jun 14 23:56:45 2014 +0400
shell32: Release cached desktop folder on process detach.
---
dlls/shell32/shell32_main.c | 1 + dlls/shell32/shell32_main.h | 1 + dlls/shell32/shfldr_desktop.c | 12 ++++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 091c6e1..679ebec 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -1281,6 +1281,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) if (fImpLoad) break; SIC_Destroy(); FreeChangeNotifications(); + release_desktop_folder(); release_typelib(); break; } diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index e7765eb..954f1e4 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -230,5 +230,6 @@ BOOL AddToEnumList(IEnumIDListImpl *list, LPITEMIDLIST pidl) DECLSPEC_HIDDEN; BOOL CreateFolderEnumList(IEnumIDListImpl *list, LPCWSTR lpszPath, DWORD dwFlags) DECLSPEC_HIDDEN;
void release_typelib(void) DECLSPEC_HIDDEN; +void release_desktop_folder(void) DECLSPEC_HIDDEN;
#endif diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c index 2910106..695e558 100644 --- a/dlls/shell32/shfldr_desktop.c +++ b/dlls/shell32/shfldr_desktop.c @@ -57,7 +57,6 @@ WINE_DEFAULT_DEBUG_CHANNEL (shell); /* Undocumented functions from shdocvw */ extern HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl);
- /*********************************************************************** * Desktopfolder implementation */ @@ -75,6 +74,8 @@ typedef struct { BOOL fAcceptFmt; /* flag for pending Drop */ } IDesktopFolderImpl;
+static IDesktopFolderImpl *cached_sf; + static inline IDesktopFolderImpl *impl_from_IShellFolder2(IShellFolder2 *iface) { return CONTAINING_RECORD(iface, IDesktopFolderImpl, IShellFolder2_iface); @@ -934,13 +935,20 @@ static const IPersistFolder2Vtbl vt_IPersistFolder2 = ISF_Desktop_IPersistFolder2_fnGetCurFolder };
+void release_desktop_folder(void) +{ + if (!cached_sf) return; + SHFree(cached_sf->pidlRoot); + SHFree(cached_sf->sPathTarget); + LocalFree(cached_sf); +} + /************************************************************************** * ISF_Desktop_Constructor */ HRESULT WINAPI ISF_Desktop_Constructor ( IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { - static IDesktopFolderImpl *cached_sf; WCHAR szMyPath[MAX_PATH];
TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid));