Fix shell32.ExtractIcon with A->W and 32 -> 16 calls

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Wed Dec 11 15:47:51 CST 2002


This function was rather ugly in that ExtractIconW called ExtractIconA
which then called InternalExtractIcon16.

Changelog
  * dlls/user/exticon.c
    Fix shell32.ExtractIcon with A->W and 16 -> 32 calls

Rolf Kalbermatter

Index: dlls/shell32/shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.108
diff -u -r1.108 shell32_main.c
--- dlls/shell32/shell32_main.c	21 Nov 2002 23:56:42 -0000	1.108
+++ dlls/shell32/shell32_main.c	11 Dec 2002 21:43:03 -0000
@@ -540,41 +540,46 @@
 
 /*************************************************************************
  * ExtractIconA				[SHELL32.@]
- *
- * FIXME
- *  if the filename is not a file return 1
  */
-HICON WINAPI ExtractIconA( HINSTANCE hInstance, LPCSTR lpszExeFileName,
-	UINT nIconIndex )
-{   HGLOBAL16 handle = InternalExtractIcon16(HINSTANCE_16(hInstance),lpszExeFileName,nIconIndex, 1);
-    TRACE("\n");
-    if( handle )
-    {
-	HICON16* ptr = (HICON16*)GlobalLock16(handle);
-	HICON16  hIcon = *ptr;
-
-	GlobalFree16(handle);
-	return HICON_32(hIcon);
-    }
-    return 0;
+HICON WINAPI ExtractIconA(HINSTANCE hInstance, LPCSTR lpszFile, UINT nIconIndex)
+{   
+  HICON ret;
+  INT len = MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, NULL, 0);
+  LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+
+  TRACE("%p %s %d\n", hInstance, lpszFile, nIconIndex);
+
+  MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len);
+  ret = ExtractIconW(hInstance, lpwstrFile, nIconIndex);
+  HeapFree(GetProcessHeap(), 0, lpwstrFile);
+  return ret;
 }
 
 /*************************************************************************
  * ExtractIconW				[SHELL32.@]
- *
- * FIXME: if the filename is not a file return 1
  */
-HICON WINAPI ExtractIconW( HINSTANCE hInstance, LPCWSTR lpszExeFileName,
-	UINT nIconIndex )
-{ LPSTR  exefn;
-  HICON  ret;
-  TRACE("\n");
-
-  exefn = HEAP_strdupWtoA(GetProcessHeap(),0,lpszExeFileName);
-  ret = ExtractIconA(hInstance,exefn,nIconIndex);
+HICON WINAPI ExtractIconW(HINSTANCE hInstance, LPCWSTR lpszFile, UINT nIconIndex)
+{
+	HICON  hIcon = NULL;
+	UINT ret;
+	UINT cx = GetSystemMetrics(SM_CXICON), cy = GetSystemMetrics(SM_CYICON);
+
+	TRACE("%p %s %d\n", hInstance, debugstr_w(lpszFile), nIconIndex);
+
+	if (nIconIndex == -1) {
+	  ret = PrivateExtractIconsW(lpszFile, 0, cx, cy, NULL, NULL, 0, LR_DEFAULTCOLOR);
+	  if (ret != 0xFFFFFFFF && ret)
+	    return ret;
+	  return NULL;
+	}
+	else
+	  ret = PrivateExtractIconsW(lpszFile, nIconIndex, cx, cy, &hIcon, NULL, 1, LR_DEFAULTCOLOR);
 
-	HeapFree(GetProcessHeap(),0,exefn);
-	return ret;
+	if (ret == 0xFFFFFFFF)
+	  return (HICON)1;
+	else if (ret > 0 && hIcon)
+	  return hIcon;
+	return NULL;
 }
 
 typedef struct 




More information about the wine-patches mailing list