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/bi... ============================================================================== --- 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