ChangeLog: * dlls/shell32/iconcache.c - Fix ANSI->Unicode calling for ExtractIconExA/W License: X11/LGPL Rolf Kalbermatter Index: dlls/shell32/iconcache.c =================================================================== RCS file: /home/wine/wine/dlls/shell32/iconcache.c,v retrieving revision 1.62 diff -u -r1.62 iconcache.c --- dlls/shell32/iconcache.c 30 Nov 2002 02:22:24 -0000 1.62 +++ dlls/shell32/iconcache.c 1 Dec 2002 22:47:22 -0000 @@ -402,56 +402,62 @@ return ExtractIconExW ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); return ExtractIconExA ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); } + /************************************************************************* * ExtractIconExA [SHELL32.@] * RETURNS * 0 no icon found - * 1 file is not valid + * 1 file is not valid, * HICON handle of a icon (phiconLarge/Small == NULL) */ -HICON WINAPI ExtractIconExA ( LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) -{ HICON ret=0; - - TRACE("file=%s idx=%i %p %p num=%i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons ); +HICON WINAPI ExtractIconExW ( LPCWSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) +{ + HICON ret=0; - if (nIconIndex==-1) /* Number of icons requested */ - return (HICON)PrivateExtractIconsA( lpszFile, -1, 0, 0, NULL, 0, 0, 0 ); + TRACE("%s %i %p %p %i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons ); - if (phiconLarge) - { - ret = (HICON)PrivateExtractIconsA( lpszFile, nIconIndex, 32, 32, phiconLarge, 0, 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)PrivateExtractIconsA( lpszFile, nIconIndex, 16, 16, phiconSmall, 0, nIcons, 0 ); - if ( nIcons==1 ) - { ret = phiconSmall[0]; - } - } + if (nIconIndex==-1) /* Number of icons requested */ + return (HICON)PrivateExtractIconsW( lpszFile, -1, 0, 0, NULL, 0, 0, 0 ); - return ret; + if (phiconLarge) + { + ret = (HICON)PrivateExtractIconsW( lpszFile, nIconIndex, 32, 32, phiconLarge, 0, 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, 0, nIcons, 0 ); + if (nIcons==1 ) + { + ret = phiconSmall[0]; + } + } + return ret; } + /************************************************************************* - * ExtractIconExW [SHELL32.@] + * ExtractIconExA [SHELL32.@] */ -HICON WINAPI ExtractIconExW ( LPCWSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) -{ LPSTR sFile; - HICON ret; - - TRACE("file=%s idx=%i %p %p num=%i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons ); - - sFile = HEAP_strdupWtoA (GetProcessHeap(),0,lpszFile); - ret = ExtractIconExA ( sFile, nIconIndex, phiconLarge, phiconSmall, nIcons); - HeapFree(GetProcessHeap(),0,sFile); - return ret; +HICON WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons ) +{ + HICON ret; + INT len = MultiByteToWideChar( CP_ACP, 0, lpszFile, -1, NULL, 0 ); + LPWSTR lpwstrFile = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + + TRACE("%s %i %p %p %i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons ); + + MultiByteToWideChar( CP_ACP, 0, lpszFile, -1, lpwstrFile, len ); + ret = ExtractIconExW ( lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIcons ); + HeapFree( GetProcessHeap(), 0, lpwstrFile ); + return ret; } /*************************************************************************