Stub implementations for SHUpdateImageA, SHHandleUpdateImage,
SHObjectProperties, SHGetNewLinkInfo{A,W}, SHStartNetConnectionDialog,
SHEmptyRecycleBin{A,W}, SHFormatDrive, SHQueryRecycleBin{A,W}.
'HeapAlloc can fail' fix for ExtractIconExA.
Implement ExtractAssociatedIconA -> W.
Correct prototype for SHObjectProperties.
Forward SHGetNewLinkInfo to SHGetNewLinkInfoA.
diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 410cc86..af4b2f5 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -420,15 +420,18 @@
*/
UINT WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons)
{
- UINT ret;
+ UINT ret = 0;
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);
+ if (lpwstrFile)
+ {
+ MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len);
+ ret = ExtractIconExW(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
+ HeapFree(GetProcessHeap(), 0, lpwstrFile);
+ }
return ret;
}
@@ -440,43 +443,55 @@
*/
HICON WINAPI ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon)
{
- HICON hIcon;
- WORD wDummyIcon = 0;
-
- TRACE("\n");
+ HICON hIcon = NULL;
+ INT len = MultiByteToWideChar(CP_ACP, 0, lpIconPath, -1, NULL, 0);
+ LPWSTR lpIconPathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- if(lpiIcon == NULL)
- lpiIcon = &wDummyIcon;
+ TRACE("%p %s %p\n", hInst, debugstr_a(lpIconPath), lpiIcon);
- hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon);
+ if (lpIconPathW)
+ {
+ MultiByteToWideChar(CP_ACP, 0, lpIconPath, -1, lpIconPathW, len);
+ hIcon = ExtractAssociatedIconW(hInst, lpIconPathW, lpiIcon);
+ HeapFree(GetProcessHeap(), 0, lpIconPathW);
+ }
+ return hIcon;
+}
- if( hIcon < (HICON)2 )
- { if( hIcon == (HICON)1 ) /* no icons found in given file */
- { char tempPath[0x80];
- HINSTANCE uRet = FindExecutableA(lpIconPath,NULL,tempPath);
+HICON WINAPI ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon)
+{
+ HICON hIcon = NULL;
+ WORD wDummyIcon = 0;
- if( uRet > (HINSTANCE)32 && tempPath[0] )
- { strcpy(lpIconPath,tempPath);
- hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon);
- if( hIcon > (HICON)2 )
- return hIcon;
- }
- else hIcon = 0;
- }
+ TRACE("%p %s %p\n", hInst, debugstr_w(lpIconPath), lpiIcon);
- if( hIcon == (HICON)1 )
- *lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
- else
- *lpiIcon = 6; /* generic icon - found nothing */
+ if(lpiIcon == NULL)
+ lpiIcon = &wDummyIcon;
- if (GetModuleFileNameA(hInst, lpIconPath, 0x80))
- {
- /* terminate string (GetModuleFileName doesn't do if buffer is too small) */
- lpIconPath[0x80 - 1] = '\0';
- hIcon = LoadIconA( hInst, MAKEINTRESOURCEA(*lpiIcon));
- }
- }
- return hIcon;
+ hIcon = ExtractIconW(hInst, lpIconPath, *lpiIcon);
+
+ if( hIcon < (HICON)2 )
+ { if( hIcon == (HICON)1 ) /* no icons found in given file */
+ { WCHAR tempPath[MAX_PATH];
+ HINSTANCE uRet = FindExecutableW(lpIconPath,NULL,tempPath);
+
+ if( uRet > (HINSTANCE)32 && tempPath[0] )
+ { lstrcpyW(lpIconPath,tempPath);
+ hIcon = ExtractIconW(hInst, lpIconPath, *lpiIcon);
+ if( hIcon > (HICON)2 )
+ return hIcon;
+ }
+ }
+
+ if( hIcon == (HICON)1 )
+ *lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
+ else
+ *lpiIcon = 6; /* generic icon - found nothing */
+
+ if (GetModuleFileNameW(hInst, lpIconPath, MAX_PATH))
+ hIcon = LoadIconW(hInst, MAKEINTRESOURCEW(*lpiIcon));
+ }
+ return hIcon;
}
/*************************************************************************
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 894924c..17e7098 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -169,9 +169,9 @@
175 stdcall SHGetSpecialFolderPath(long long long long) SHGetSpecialFolderPathAW
176 stdcall SHSetInstanceExplorer (long)
177 stub DAD_SetDragImageFromListView
- 178 stub SHObjectProperties
- 179 stub SHGetNewLinkInfoA
- 180 stub SHGetNewLinkInfoW
+ 178 stdcall SHObjectProperties(long long wstr wstr)
+ 179 stdcall SHGetNewLinkInfoA(str str ptr long long)
+ 180 stdcall SHGetNewLinkInfoW(wstr wstr ptr long long)
181 stdcall RegisterShellHook(long long)
182 varargs ShellMessageBoxW(long long long str long)
183 varargs ShellMessageBoxA(long long long str long)
@@ -182,9 +182,9 @@
188 stdcall ShellDDEInit(long)
189 stdcall ILCreateFromPathA(str)
190 stdcall ILCreateFromPathW(wstr)
- 191 stub SHUpdateImageA
+ 191 stdcall SHUpdateImageA(str long long long)
192 stdcall SHUpdateImageW(wstr long long long)
- 193 stub SHHandleUpdateImage
+ 193 stdcall SHHandleUpdateImage(ptr)
194 stub SHCreatePropSheetExtArrayEx
195 stdcall SHFree(ptr)
196 stdcall SHAlloc(long)
@@ -206,7 +206,7 @@
212 stub Printers_AddPrinterPropPages
213 stub Printers_RegisterWindowW
214 stub Printers_UnregisterWindow
- 215 stub SHStartNetConnectionDialog
+ 215 stdcall SHStartNetConnectionDialog(long str long)
243 stdcall @(long long) shell32_243
244 stdcall SHInitRestricted(ptr ptr)
247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long)
@@ -242,8 +242,8 @@
296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIconA
297 stdcall Shell_NotifyIconA(long ptr)
298 stdcall Shell_NotifyIconW(long ptr)
- 299 stub Shl1632_ThunkData32
- 300 stub Shl3216_ThunkData32
+#299 stub Shl1632_ThunkData32
+#300 stub Shl3216_ThunkData32
301 stdcall StrChrA(str long) shlwapi.StrChrA
302 stdcall StrChrIA(str long) shlwapi.StrChrIA
303 stdcall StrChrIW(wstr long) shlwapi.StrChrIW
@@ -338,10 +338,10 @@
@ stdcall DoEnvironmentSubstW(wstr wstr)
@ stub DragQueryFileAorW
@ stdcall DuplicateIcon(long long)
-@ stdcall ExtractAssociatedIconA(long ptr long)
+@ stdcall ExtractAssociatedIconA(long str ptr)
@ stdcall ExtractAssociatedIconExA(long str long long)
@ stdcall ExtractAssociatedIconExW(long wstr long long)
-@ stub ExtractAssociatedIconW
+@ stdcall ExtractAssociatedIconW(long wstr ptr)
@ stdcall ExtractIconA(long str long)
@ stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconExA
@ stdcall ExtractIconExA(str long ptr ptr long)
@@ -376,12 +376,12 @@
@ stdcall SHCreateDirectoryExA(long str ptr)
@ stdcall SHCreateDirectoryExW(long wstr ptr)
@ stub ShellHookProc
-@ stub SHEmptyRecycleBinA
-@ stub SHEmptyRecycleBinW
+@ stdcall SHEmptyRecycleBinA(long str long)
+@ stdcall SHEmptyRecycleBinW(long wstr long)
@ stdcall SHFileOperation(ptr) SHFileOperationA
@ stdcall SHFileOperationA(ptr)
@ stdcall SHFileOperationW(ptr)
-@ stub SHFormatDrive
+@ stdcall SHFormatDrive(long long long long)
@ stdcall SHFreeNameMappings(ptr)
@ stdcall SHGetDesktopFolder(ptr)
@ stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfoA
@@ -389,7 +389,7 @@
@ stdcall SHGetFileInfoW(ptr long ptr long long)
@ stdcall SHGetInstanceExplorer(long)
@ stdcall SHGetMalloc(ptr)
-@ stub SHGetNewLinkInfo
+@ stdcall SHGetNewLinkInfo(str str ptr long long) SHGetNewLinkInfoA
@ stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDListA
@ stdcall SHGetPathFromIDListA(ptr ptr)
@ stdcall SHGetPathFromIDListW(ptr ptr)
@@ -399,8 +399,8 @@
@ stub SHHelpShortcuts_RunDLLA
@ stub SHHelpShortcuts_RunDLLW
@ stdcall SHLoadInProc(long)
-@ stub SHQueryRecycleBinA
-@ stub SHQueryRecycleBinW
+@ stdcall SHQueryRecycleBinA(str ptr)
+@ stdcall SHQueryRecycleBinW(wstr ptr)
@ stub SHUpdateRecycleBinIcon
@ stub WOWShellExecute
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 13f3d7a..ad6261e 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -1546,5 +1546,90 @@
*/
void WINAPI SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex)
{
- FIXME("%s, %d, 0x%x, %d\n", debugstr_w(pszHashItem), iIndex, uFlags, iImageIndex);
+ FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_w(pszHashItem), iIndex, uFlags, iImageIndex);
+}
+
+VOID WINAPI SHUpdateImageA(LPCSTR pszHashItem, INT iIndex, UINT uFlags, INT iImageIndex)
+{
+ FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_a(pszHashItem), iIndex, uFlags, iImageIndex);
+}
+
+INT WINAPI SHHandleUpdateImage(LPCITEMIDLIST pidlExtra)
+{
+ FIXME("%p - stub\n", pidlExtra);
+
+ return -1;
+}
+
+BOOL WINAPI SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR szObject, LPCWSTR szPage)
+{
+ FIXME("%p, 0x%08lx, %s, %s - stub\n", hwnd, dwType, debugstr_w(szObject), debugstr_w(szPage));
+
+ return TRUE;
+}
+
+BOOL WINAPI SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy,
+ UINT uFlags)
+{
+ FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_a(pszLinkTo), debugstr_a(pszDir),
+ pszName, pfMustCopy, uFlags);
+
+ return FALSE;
+}
+
+BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy,
+ UINT uFlags)
+{
+ FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_w(pszLinkTo), debugstr_w(pszDir),
+ pszName, pfMustCopy, uFlags);
+
+ return FALSE;
+}
+
+HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType)
+{
+ FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRemoteName), dwType);
+
+ return S_OK;
+}
+
+HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
+{
+ FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRootPath), dwFlags);
+
+ return S_OK;
+}
+
+HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
+{
+ FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_w(pszRootPath), dwFlags);
+
+ return S_OK;
+}
+
+DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options)
+{
+ FIXME("%p, 0x%08x, 0x%08x, 0x%08x - stub\n", hwnd, drive, fmtID, options);
+
+ return SHFMT_NOFORMAT;
+}
+
+HRESULT WINAPI SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
+{
+ FIXME("%s, %p - stub\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
+
+ pSHQueryRBInfo->i64Size = 0;
+ pSHQueryRBInfo->i64NumItems = 0;
+
+ return S_OK;
+}
+
+HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
+{
+ FIXME("%s, %p - stub\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
+
+ pSHQueryRBInfo->i64Size = 0;
+ pSHQueryRBInfo->i64NumItems = 0;
+
+ return S_OK;
}
diff --git a/include/shellapi.h b/include/shellapi.h
index e5d4ecc..50960ba 100644
--- a/include/shellapi.h
+++ b/include/shellapi.h
@@ -400,6 +400,24 @@
#define SHGetNewLinkInfo WINELIB_NAME_AW(SHGetNewLinkInfo)
/******************************************
+ * Recycle bin
+ */
+
+typedef struct _SHQUERYRBINFO
+{
+ DWORD cbSize;
+ DWORDLONG i64Size;
+ DWORDLONG i64NumItems;
+} SHQUERYRBINFO, *LPSHQUERYRBINFO;
+
+HRESULT WINAPI SHEmptyRecycleBinA(HWND,LPCSTR,DWORD);
+HRESULT WINAPI SHEmptyRecycleBinW(HWND,LPCWSTR,DWORD);
+#define SHEmptyRecycleBin WINELIB_NAME_AW(SHEmptyRecycleBin)
+HRESULT WINAPI SHQueryRecycleBinA(LPCSTR,LPSHQUERYRBINFO);
+HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR,LPSHQUERYRBINFO);
+#define SHQueryRecycleBin WINELIB_NAME_AW(SHQueryRecycleBin)
+
+/******************************************
* Misc
*/
diff --git a/include/shlobj.h b/include/shlobj.h
index 839f8bf..259e66c 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -41,26 +41,34 @@
#define SHCLSIDFromString WINELIB_NAME_AW(SHCLSIDFromString)
HRESULT WINAPI SHCreateStdEnumFmtEtc(DWORD,const FORMATETC *,IEnumFORMATETC**);
BOOL WINAPI SHFindFiles(LPCITEMIDLIST,LPCITEMIDLIST);
+DWORD WINAPI SHFormatDrive(HWND,UINT,UINT,UINT);
void WINAPI SHFree(LPVOID);
BOOL WINAPI GetFileNameFromBrowse(HWND,LPSTR,DWORD,LPCSTR,LPCSTR,LPCSTR,LPCSTR);
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR);
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR);
#define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList)
+INT WINAPI SHHandleUpdateImage(LPCITEMIDLIST);
HRESULT WINAPI SHILCreateFromPath(LPCWSTR,LPITEMIDLIST*,DWORD*);
HRESULT WINAPI SHLoadOLE(LPARAM);
LPITEMIDLIST WINAPI SHSimpleIDListFromPath(LPCWSTR);
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*);
-
+HRESULT WINAPI SHStartNetConnectionDialog(HWND,LPCSTR,DWORD);
+VOID WINAPI SHUpdateImageA(LPCSTR,INT,UINT,INT);
+VOID WINAPI SHUpdateImageW(LPCWSTR,INT,UINT,INT);
+#define SHUpdateImage WINELIB_NAME_AW(SHUpdateImage)
int WINAPI RestartDialog(HWND,LPCWSTR,DWORD);
int WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD);
+#define SHFMT_ERROR 0xFFFFFFFFL /* Error on last format, drive may be formatable */
+#define SHFMT_CANCEL 0xFFFFFFFEL /* Last format was canceled */
+#define SHFMT_NOFORMAT 0xFFFFFFFDL /* Drive is not formatable */
/* SHObjectProperties flags */
#define SHOP_PRINTERNAME 0x01
#define SHOP_FILEPATH 0x02
#define SHOP_VOLUMEGUID 0x04
-BOOL WINAPI SHObjectProperties(HWND,UINT,LPCWSTR,LPCWSTR);
+BOOL WINAPI SHObjectProperties(HWND,DWORD,LPCWSTR,LPCWSTR);
#define PCS_FATAL 0x80000000
#define PCS_REPLACEDCHAR 0x00000001