shell32:ExtractIconEx{AW} take 2

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Tue Dec 3 06:25:35 CST 2002


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	3 Dec 2002 12:24:43 -0000
@@ -402,56 +402,62 @@
 	  return ExtractIconExW ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
 	return ExtractIconExA ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
 }
+
 /*************************************************************************
- * ExtractIconExA			[SHELL32.@]
- * RETURNS
+ * ExtractIconExW			[SHELL32.@]
+ * RETURNS: 
  *  0 no icon found
  *  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 );
-
-	if (nIconIndex==-1)	/* Number of icons requested */
-            return (HICON)PrivateExtractIconsA( lpszFile, -1, 0, 0, NULL, 0, 0, 0 );
-
-	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];
-	  }
-	}
-
-	return ret;
+HICON 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);
+
+    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;
 }
+
 /*************************************************************************
- * 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;
 }
 
 /*************************************************************************




More information about the wine-patches mailing list