[ros-diffs] [tkreuzer] 25726: Make LoadCursorIconImage() find shared icons, even if they don't have the desired width/height. Now explorer doesn't leak icons / bitmaps anymore. fixes bug 1554 See issue #1554 for more details.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Mon Feb 5 02:00:00 CET 2007


Author: tkreuzer
Date: Mon Feb  5 03:59:59 2007
New Revision: 25726

URL: http://svn.reactos.org/svn/reactos?rev=25726&view=rev
Log:
Make LoadCursorIconImage() find shared icons, even if they don't have the desired width/height. Now explorer doesn't leak icons / bitmaps anymore.

fixes bug 1554
See issue #1554 for more details.

Modified:
    trunk/reactos/dll/win32/user32/windows/bitmap.c

Modified: trunk/reactos/dll/win32/user32/windows/bitmap.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/bitmap.c?rev=25726&r1=25725&r2=25726&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/bitmap.c (original)
+++ trunk/reactos/dll/win32/user32/windows/bitmap.c Mon Feb  5 03:59:59 2007
@@ -186,9 +186,8 @@
    UINT fuLoad,
    ULONG uType)
 {
+   HRSRC hResInfo;
    HANDLE hResource;
-   HANDLE h2Resource;
-   HANDLE hfRes;
    HANDLE hFile;
    HANDLE hSection;
    CURSORICONFILEDIR *IconDIR;
@@ -211,52 +210,69 @@
       if (hinst == NULL)
          hinst = User32Instance;
 
-      hResource = hfRes = FindResourceW(hinst, lpszName,
+      hResInfo = FindResourceW(hinst, lpszName,
                                         Icon ? RT_GROUP_ICON : RT_GROUP_CURSOR);
-      if (hResource == NULL)
-         return NULL;
-
-      if (fuLoad & LR_SHARED)
-      {
-         hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height);
-         if (hIcon)
-            return hIcon;
-      }
-
-      hResource = LoadResource(hinst, hResource);
+      if (hResInfo == NULL)
+         return NULL;
+
+      hResource = LoadResource(hinst, hResInfo);
       if (hResource == NULL)
          return NULL;
 
       IconResDir = LockResource(hResource);
       if (IconResDir == NULL)
-         return NULL;
+      {
+         FreeResource(hResource);
+         return NULL;
+      }
 
       /* Find the best fitting in the IconResDir for this resolution */
       id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, Icon, width, height,
                                        fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
 
-      h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id),
+      FreeResource(hResource);
+
+      hResInfo = FindResourceW(hinst, MAKEINTRESOURCEW(id),
                                  Icon ? (LPCWSTR) RT_ICON :
                                  (LPCWSTR) RT_CURSOR);
-      if (h2Resource == NULL)
-         return NULL;
-
-      hResource = LoadResource(hinst, h2Resource);
+      if (hResInfo == NULL)
+      {
+         return NULL;
+      }
+
+      /* Now we have found the icon we want to load.
+       * Let's see if we already loaded it */
+      if (fuLoad & LR_SHARED)
+      {
+         hIcon = NtUserFindExistingCursorIcon(hinst, hResInfo, 0, 0);
+         if (hIcon)
+         {
+            return hIcon;
+         }
+      }
+
+      hResource = LoadResource(hinst, hResInfo);
       if (hResource == NULL)
-         return NULL;
+      {
+         return NULL;
+      }
 
       ResIcon = LockResource(hResource);
       if (ResIcon == NULL)
-         return NULL;
+      {
+         FreeResource(hResource);
+         return NULL;
+      }
 
       hIcon = CreateIconFromResourceEx((PBYTE)ResIcon,
-                                       SizeofResource(hinst, h2Resource),
+                                       SizeofResource(hinst, hResInfo),
                                        Icon, 0x00030000, width, height,
                                        fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
+      FreeResource(hResource);
 
       if (hIcon && 0 != (fuLoad & LR_SHARED))
       {
-         NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
+         NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, hResInfo,
                                  (HRSRC)NULL);
       }
 
@@ -650,7 +666,7 @@
                     {
                         /* Look if the colors of the DIB are black and white */
 
-                        monochrome = 
+                        monochrome =
                               (bi->bmiColors[0].rgbRed == 0xff
                             && bi->bmiColors[0].rgbGreen == 0xff
                             && bi->bmiColors[0].rgbBlue == 0xff




More information about the Ros-diffs mailing list