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