I checked several location for the right protoype to ExtractIconEx() and did see some inconsistencies. In an older SDK help file from Visual C 5.0 it states that this function returns a HICON just as its seemingly sibling ExtractIcon(). However in the according headers for WinNT 4.0 the definitions are already to return an UINT. Newer SDK documentations and headers both for Visual C 6.0 and the MSDN online documentation do agree that this function returns an UINT. So here is a patch which changes that accordingly and at the same time calls the PrivateExtractIconEx function from user32 directly since several tests on my Win2K system show that they return indeed exactly the same parameters for different calling scenarios (and under no circumstances anything which could be interpreted as a HICON but always the number of extracted icon pairs on success). Changelog * dlls/shell32/iconcache.c Change the return value for ExtractIconEx from HICON to UINT and make the function call directly user32.PrivateExtractIconEx * include/shellapi.h Change the return value for ExtractIconEx from HICON to UINT retrieving revision 1.63 diff -u -r1.63 iconcache.c --- dlls/shell32/iconcache.c 3 Dec 2002 21:35:43 -0000 1.63 +++ dlls/shell32/iconcache.c 6 Dec 2002 21:29:10 -0000 @@ -397,7 +397,7 @@ /************************************************************************* * ExtractIconEx [SHELL32.@] */ -HICON WINAPI ExtractIconExAW ( LPCVOID lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) +UINT WINAPI ExtractIconExAW(LPCVOID lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) { if (SHELL_OsIsUnicode()) return ExtractIconExW ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); return ExtractIconExA ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); @@ -407,48 +407,22 @@ * ExtractIconExW [SHELL32.@] * RETURNS: * 0 no icon found - * 1 file is not valid - * HICON handle of a icon (phiconLarge/Small == NULL) + * -1 file is not valid + * or number of icons extracted */ -HICON WINAPI ExtractIconExW( LPCWSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) +UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) { - HICON ret = 0; + TRACE("%s %i %p %p %i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons); - TRACE("%s %i %p %p %i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons); - - if (phiconLarge && !phiconSmall && nIconIndex == -1) /* Number of icons requested */ - return (HICON)PrivateExtractIconsW(lpszFile, 0, 0, 0, NULL, NULL, 0, 0); - - if (phiconLarge) - { - ret = (HICON)PrivateExtractIconsW(lpszFile, nIconIndex, 32, 32, phiconLarge, NULL, nIcons, 0); - if (nIcons==1) - { - ret = phiconLarge[0]; - } - } - - /* if no pointers given and one icon expected, return the handle directly */ - if (!phiconLarge && !phiconSmall && nIcons==1) - phiconSmall = &ret; - - if (phiconSmall) - { - ret = (HICON)PrivateExtractIconsW(lpszFile, nIconIndex, 16, 16, phiconSmall, NULL, nIcons, 0); - if (nIcons==1) - { - ret = phiconSmall[0]; - } - } - return ret; + return PrivateExtractIconExW(lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); } /************************************************************************* * ExtractIconExA [SHELL32.@] */ -HICON WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) +UINT WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) { - HICON ret; + UINT ret; INT len = MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, NULL, 0); LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); Index: include/shellapi.h =================================================================== RCS file: /home/wine/wine/include/shellapi.h,v retrieving revision 1.18 diff -u -r1.18 shellapi.h --- include/shellapi.h 30 Nov 2002 02:22:24 -0000 1.18 +++ include/shellapi.h 6 Dec 2002 21:13:27 -0000 @@ -273,10 +273,10 @@ HICON WINAPI ExtractAssociatedIconExA(HINSTANCE,LPSTR,LPWORD,LPWORD); HICON WINAPI ExtractAssociatedIconExW(HINSTANCE,LPWSTR,LPWORD,LPWORD); #define ExtractAssociatedIconEx WINELIB_NAME_AW(ExtractAssociatedIconEx) -HICON WINAPI ExtractIconExA( LPCSTR, INT, HICON *, HICON *, UINT ); -HICON WINAPI ExtractIconExW( LPCWSTR, INT, HICON *, HICON *, UINT ); +UINT WINAPI ExtractIconExA(LPCSTR,INT,HICON*,HICON*,UINT); +UINT WINAPI ExtractIconExW(LPCWSTR,INT,HICON*,HICON*,UINT); #define ExtractIconEx WINELIB_NAME_AW(ExtractIconEx) -HICON WINAPI ExtractIconExAW(LPCVOID, INT, HICON *, HICON *, UINT ); +UINT WINAPI ExtractIconExAW(LPCVOID,INT,HICON*,HICON*,UINT); HINSTANCE WINAPI FindExecutableA(LPCSTR,LPCSTR,LPSTR); HINSTANCE WINAPI FindExecutableW(LPCWSTR,LPCWSTR,LPWSTR); #define FindExecutable WINELIB_NAME_AW(FindExecutable)