Nikolay Sivov : shell32: Release cached desktop folder on process detach.

Alexandre Julliard julliard at winehq.org
Mon Jun 16 12:37:49 CDT 2014


Module: wine
Branch: master
Commit: d3a034e3482637ad28dc2d36eba27d2c94b8a6ae
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d3a034e3482637ad28dc2d36eba27d2c94b8a6ae

Author: Nikolay Sivov <nsivov at 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));




More information about the wine-cvs mailing list