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/b…
==============================================================================
--- 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