diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 04924c0563d..34b906c2fd5 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -846,17 +846,16 @@ HICON WINAPI DuplicateIcon( HINSTANCE hInstance, HICON hIcon) /************************************************************************* * ExtractIconA [SHELL32.@] */ -HICON WINAPI ExtractIconA(HINSTANCE hInstance, LPCSTR lpszFile, UINT nIconIndex) -{ +HICON WINAPI ExtractIconA(HINSTANCE hInstance, const char *file, UINT nIconIndex) +{ + WCHAR *fileW; 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); + TRACE("%p %s %d\n", hInstance, debugstr_a(file), nIconIndex); - MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len); - ret = ExtractIconW(hInstance, lpwstrFile, nIconIndex); - HeapFree(GetProcessHeap(), 0, lpwstrFile); + fileW = strdupAtoW(file); + ret = ExtractIconW(hInstance, fileW, nIconIndex); + HeapFree(GetProcessHeap(), 0, fileW); return ret; } diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 941ca74f321..fc2a5ba8a86 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -236,4 +236,19 @@ static inline WCHAR *strdupW(const WCHAR *src) return dest; } +static inline WCHAR *strdupAtoW(const char *str) +{ + WCHAR *ret; + DWORD len; + + if (!str) return NULL; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (ret) + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + #endif