Author: akhaldi Date: Mon Nov 3 18:53:50 2014 New Revision: 65231
URL: http://svn.reactos.org/svn/reactos?rev=65231&view=rev Log: [SHELL32] * Another partial sync of shellord.c with Wine 1.7.27. CORE-8540
Modified: branches/shell-experiments/dll/win32/shell32/wine/shellord.c
Modified: branches/shell-experiments/dll/win32/shell32/wine/shellord.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shel... ============================================================================== --- branches/shell-experiments/dll/win32/shell32/wine/shellord.c [iso-8859-1] (original) +++ branches/shell-experiments/dll/win32/shell32/wine/shellord.c [iso-8859-1] Mon Nov 3 18:53:50 2014 @@ -63,12 +63,11 @@ #define MRUF_BINARY_LIST 1 /* list will contain binary data */ #define MRUF_DELAYED_SAVE 2 /* only save list order to reg. is FreeMRUList */
-VOID WINAPI FreeMRUList(HANDLE); - -EXTERN_C HANDLE WINAPI CreateMRUListA(LPCREATEMRULISTA lpcml); -EXTERN_C INT WINAPI AddMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData); -EXTERN_C INT WINAPI FindMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum); -EXTERN_C INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize); +extern HANDLE WINAPI CreateMRUListA(LPCREATEMRULISTA lpcml); +extern VOID WINAPI FreeMRUList(HANDLE hMRUList); +extern INT WINAPI AddMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData); +extern INT WINAPI FindMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum); +extern INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize);
/* Get a function pointer from a DLL handle */ @@ -152,11 +151,11 @@ /************************************************************************* * ParseField [SHELL32.58] */ -EXTERN_C DWORD WINAPI ParseFieldAW(LPCVOID src, DWORD nField, LPVOID dst, DWORD len) +DWORD WINAPI ParseFieldAW(LPCVOID src, DWORD nField, LPVOID dst, DWORD len) { if (SHELL_OsIsUnicode()) - return ParseFieldW((LPCWSTR)src, nField, (LPWSTR)dst, len); - return ParseFieldA((LPCSTR)src, nField, (LPSTR)dst, len); + return ParseFieldW(src, nField, dst, len); + return ParseFieldA(src, nField, dst, len); }
/************************************************************************* @@ -211,7 +210,7 @@ /************************************************************************* * SHGetSetSettings [SHELL32.68] */ -EXTERN_C VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) +VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) { if(bSet) { @@ -231,7 +230,7 @@ * and possibly are the same in nt40 * */ -EXTERN_C VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) +VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) { HKEY hKey; DWORD dwData; @@ -345,7 +344,7 @@ * ordinal. If you change the implementation here please update the code in * shlwapi as well. */ -EXTERN_C int ShellMessageBoxW( +int ShellMessageBoxW( HINSTANCE hInstance, HWND hWnd, LPCWSTR lpText, @@ -356,10 +355,10 @@ WCHAR szText[100],szTitle[100]; LPCWSTR pszText = szText, pszTitle = szTitle; LPWSTR pszTemp; - va_list args; + __ms_va_list args; int ret;
- va_start(args, uType); + __ms_va_start(args, uType); /* wvsprintfA(buf,fmt, args); */
TRACE("(%p,%p,%p,%p,%08x)\n", @@ -378,7 +377,7 @@ FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, pszText, 0, 0, (LPWSTR)&pszTemp, 0, &args);
- va_end(args); + __ms_va_end(args);
ret = MessageBoxW(hWnd,pszTemp,pszTitle,uType); LocalFree(pszTemp); @@ -403,7 +402,7 @@ * NOTES * Exported by ordinal */ -EXTERN_C int ShellMessageBoxA( +int ShellMessageBoxA( HINSTANCE hInstance, HWND hWnd, LPCSTR lpText, @@ -414,10 +413,10 @@ char szText[100],szTitle[100]; LPCSTR pszText = szText, pszTitle = szTitle; LPSTR pszTemp; - va_list args; + __ms_va_list args; int ret;
- va_start(args, uType); + __ms_va_start(args, uType); /* wvsprintfA(buf,fmt, args); */
TRACE("(%p,%p,%p,%p,%08x)\n", @@ -436,7 +435,7 @@ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, pszText, 0, 0, (LPSTR)&pszTemp, 0, &args);
- va_end(args); + __ms_va_end(args);
ret = MessageBoxA(hWnd,pszTemp,pszTitle,uType); LocalFree(pszTemp); @@ -515,7 +514,7 @@ */ HRESULT WINAPI SHDoDragDrop( HWND hWnd, - IDataObject * lpDataObject, + LPDATAOBJECT lpDataObject, LPDROPSOURCE lpDropSource, DWORD dwOKEffect, LPDWORD pdwEffect) @@ -529,12 +528,8 @@ * ArrangeWindows [SHELL32.184] * */ -WORD WINAPI ArrangeWindows( - HWND hwndParent, - DWORD dwReserved, - LPCRECT lpRect, - WORD cKids, - CONST HWND * lpKids) +WORD WINAPI ArrangeWindows(HWND hwndParent, DWORD dwReserved, const RECT *lpRect, + WORD cKids, const HWND *lpKids) { /* Unimplemented in WinXP SP3 */ TRACE("(%p 0x%08x %p 0x%04x %p):stub.\n", @@ -548,12 +543,12 @@ * NOTES * exported by ordinal */ -EXTERN_C BOOL WINAPI -SignalFileOpen (LPCITEMIDLIST pidl) -{ - FIXME("(0x%08x):stub.\n", pidl); - - return 0; +BOOL WINAPI +SignalFileOpen (PCIDLIST_ABSOLUTE pidl) +{ + FIXME("(%p):stub.\n", pidl); + + return FALSE; }
/************************************************************************* @@ -611,7 +606,7 @@ */ static INT CALLBACK SHADD_compare_mru(LPCVOID data1, LPCVOID data2, DWORD cbData) { - return lstrcmpiA((LPCSTR)data1, (LPCSTR)data2); + return lstrcmpiA(data1, data2); }
/************************************************************************* @@ -765,6 +760,7 @@ link_dir[0] = 0; ERR("serious issues 1\n"); } + IMalloc_Release(ppM); } else { /* serious issues */ @@ -814,15 +810,15 @@ switch (uFlags) { case SHARD_PIDL: - SHGetPathFromIDListA((LPCITEMIDLIST)pv, doc_name); + SHGetPathFromIDListA(pv, doc_name); break;
case SHARD_PATHA: - lstrcpynA(doc_name, (LPCSTR)pv, MAX_PATH); + lstrcpynA(doc_name, pv, MAX_PATH); break;
case SHARD_PATHW: - WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pv, -1, doc_name, MAX_PATH, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, pv, -1, doc_name, MAX_PATH, NULL, NULL); break;
default: @@ -832,6 +828,7 @@
TRACE("full document name %s\n", debugstr_a(doc_name));
+#ifdef __REACTOS__ /* check if file is a shortcut */ ext = strrchr(doc_name, '.'); if (!lstrcmpiA(ext, ".lnk")) @@ -848,6 +845,7 @@ /* executables are not added */ return; } +#endif
PathStripPathA(doc_name); TRACE("stripped document name %s\n", debugstr_a(doc_name)); @@ -978,7 +976,8 @@ (LPVOID )&psl); if(SUCCEEDED(hres)) {
- hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile, (LPVOID *)&pPf); + hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile, + (LPVOID *)&pPf); if(FAILED(hres)) { /* bombed */ ERR("failed QueryInterface for IPersistFile %08x\n", hres); @@ -1013,9 +1012,13 @@ if(FAILED(hres)) { /* bombed */ ERR("failed IPersistFile::Save %08x\n", hres); + IPersistFile_Release(pPf); + IShellLinkA_Release(psl); goto fail; } hres = IPersistFile_SaveCompleted(pPf, widelink); + IPersistFile_Release(pPf); + IShellLinkA_Release(psl); TRACE("shortcut %s has been created, result=%08x\n", new_lnk_filepath, hres); } @@ -1062,6 +1065,7 @@ return hRes;
hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv); + IShellView_Release(psf);
return hRes; } @@ -1069,7 +1073,7 @@ * SHWinHelp [SHELL32.127] * */ -EXTERN_C HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z) +HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z) { FIXME("0x%08x 0x%08x 0x%08x 0x%08x stub\n",v,w,x,z); return 0; } @@ -1077,20 +1081,20 @@ * SHRunControlPanel [SHELL32.161] * */ -EXTERN_C BOOL WINAPI SHRunControlPanel (LPCWSTR lpcszCmdLine, HWND hwndMsgParent) -{ - FIXME("0x%08x 0x%08x stub\n",lpcszCmdLine,hwndMsgParent); - return 0; -} - -static IUnknown * SHELL32_IExplorerInterface=0; +BOOL WINAPI SHRunControlPanel (LPCWSTR commandLine, HWND parent) +{ + FIXME("(%s, %p): stub\n", debugstr_w(commandLine), parent); + return FALSE; +} + +static LPUNKNOWN SHELL32_IExplorerInterface=0; /************************************************************************* * SHSetInstanceExplorer [SHELL32.176] * * NOTES * Sets the interface */ -VOID WINAPI SHSetInstanceExplorer (IUnknown * lpUnknown) +VOID WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown) { TRACE("%p\n", lpUnknown); SHELL32_IExplorerInterface = lpUnknown; } @@ -1289,8 +1293,7 @@ * */ BOOL WINAPI FileIconInit(BOOL bFullInit) -{ - FIXME("(%s)\n", bFullInit ? "true" : "false"); +{ FIXME("(%s)\n", bFullInit ? "true" : "false"); return FALSE; }
@@ -1331,7 +1334,7 @@ } }
- lpGroups = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(), 0, dwSize); + lpGroups = HeapAlloc(GetProcessHeap(), 0, dwSize); if (lpGroups == NULL) { CloseHandle(hToken); @@ -1427,7 +1430,7 @@ /************************************************************************* * SetAppStartingCursor [SHELL32.99] */ -EXTERN_C HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v) +HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v) { FIXME("hwnd=%p 0x%04x stub\n",u,v ); return 0; } @@ -1459,7 +1462,7 @@ * DriveType [SHELL32.64] * */ -EXTERN_C int WINAPI DriveType(int DriveType) +int WINAPI DriveType(int DriveType) { WCHAR root[] = L"A:\"; root[0] = L'A' + DriveType; @@ -1469,7 +1472,7 @@ * InvalidateDriveType [SHELL32.65] * Unimplemented in XP SP3 */ -EXTERN_C int WINAPI InvalidateDriveType(int u) +int WINAPI InvalidateDriveType(int u) { TRACE("0x%08x stub\n",u); return 0; @@ -1478,7 +1481,7 @@ * SHAbortInvokeCommand [SHELL32.198] * */ -EXTERN_C HRESULT WINAPI SHAbortInvokeCommand(void) +HRESULT WINAPI SHAbortInvokeCommand(void) { FIXME("stub\n"); return 1; } @@ -1498,7 +1501,7 @@ * SHFlushClipboard [SHELL32.121] * */ -EXTERN_C HRESULT WINAPI SHFlushClipboard(void) +HRESULT WINAPI SHFlushClipboard(void) { return OleFlushClipboard(); } @@ -1513,7 +1516,7 @@ DWORD dwTimeout) { FIXME("%p 0x%08x 0x%08x stub\n", pidl, dwFlags, dwTimeout); - return 0; + return FALSE; }
/************************************************************************ @@ -1522,19 +1525,18 @@ * NOTES * builds a DPA */ -EXTERN_C DWORD WINAPI RLBuildListOfPaths (void) +DWORD WINAPI RLBuildListOfPaths (void) { FIXME("stub\n"); return 0; } - /************************************************************************ * SHValidateUNC [SHELL32.173] * */ -EXTERN_C BOOL WINAPI SHValidateUNC (HWND hwndOwner, LPWSTR pszFile, UINT fConnect) -{ - FIXME("0x%08x 0x%08x 0x%08x stub\n",hwndOwner,pszFile,fConnect); - return 0; +BOOL WINAPI SHValidateUNC (HWND hwndOwner, PWSTR pszFile, UINT fConnect) +{ + FIXME("(%p, %s, 0x%08x): stub\n", hwndOwner, debugstr_w(pszFile), fConnect); + return FALSE; }
/************************************************************************ @@ -1542,7 +1544,7 @@ * * See DoEnvironmentSubstW. */ -EXTERN_C DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString) +DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString) { LPSTR dst; BOOL res = FALSE; @@ -1587,7 +1589,7 @@ * HIWORD: FALSE * LOWORD: provided size of the buffer in characters */ -EXTERN_C DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString) +DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString) { LPWSTR dst; BOOL res = FALSE; @@ -1595,7 +1597,7 @@
TRACE("(%s, %d)\n", debugstr_w(pszString), cchString);
- if ((cchString < MAXLONG) && (dst = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchString * sizeof(WCHAR)))) + if ((cchString < MAXLONG) && (dst = HeapAlloc(GetProcessHeap(), 0, cchString * sizeof(WCHAR)))) { len = ExpandEnvironmentStringsW(pszString, dst, cchString); /* len includes the terminating 0 */ @@ -1620,8 +1622,8 @@ DWORD WINAPI DoEnvironmentSubstAW(LPVOID x, UINT y) { if (SHELL_OsIsUnicode()) - return DoEnvironmentSubstW((LPWSTR)x, y); - return DoEnvironmentSubstA((LPSTR)x, y); + return DoEnvironmentSubstW(x, y); + return DoEnvironmentSubstA(x, y); }
/************************************************************************* @@ -1647,18 +1649,9 @@ /************************************************************************* * PathIsTemporaryW [SHELL32.714] */ -EXTERN_C BOOL WINAPI PathIsTemporaryW(LPWSTR Str) -{ - FIXME("(%s)stub\n", debugstr_w(Str)); - return FALSE; -} - -/************************************************************************* - * PathIsTemporaryA [SHELL32.713] - */ -EXTERN_C BOOL WINAPI PathIsTemporaryA(LPSTR Str) -{ - FIXME("(%s)stub\n", debugstr_a(Str)); +BOOL WINAPI PathIsTemporaryW(LPWSTR Str) +{ + FIXME("(%s)stub\n", debugstr_w(Str)); return FALSE; }
@@ -1666,7 +1659,7 @@ { UINT uiCount; UINT uiAllocated; - IShellPropSheetExt *pspsx[0]; + IShellPropSheetExt *pspsx[1]; } PSXA, *PPSXA;
typedef struct _PSXA_CALL @@ -1737,7 +1730,7 @@ /************************************************************************* * SHCreatePropSheetExtArrayEx [SHELL32.194] */ -EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj) +HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, LPDATAOBJECT pDataObj) { static const WCHAR szPropSheetSubKey[] = {'s','h','e','l','l','e','x','\','P','r','o','p','e','r','t','y','S','h','e','e','t','H','a','n','d','l','e','r','s',0}; WCHAR szHandler[64]; @@ -1747,9 +1740,10 @@ CLSID clsid; LONG lRet; DWORD dwIndex; + IShellExtInit *psxi; + IShellPropSheetExt *pspsx; HKEY hkBase, hkPropSheetHandlers; PPSXA psxa = NULL; - HRESULT hr;
TRACE("(%p,%s,%u)\n", hKey, debugstr_w(pszSubKey), max_iface);
@@ -1766,9 +1760,10 @@ if (lRet == ERROR_SUCCESS) { /* Create and initialize the Property Sheet Extensions Array */ - psxa = (PPSXA)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PSXA) + max_iface * sizeof(IShellPropSheetExt *)); + psxa = LocalAlloc(LMEM_FIXED, FIELD_OFFSET(PSXA, pspsx[max_iface])); if (psxa) { + ZeroMemory(psxa, FIELD_OFFSET(PSXA, pspsx[max_iface])); psxa->uiAllocated = max_iface;
/* Enumerate all subkeys and attempt to load the shell extensions */ @@ -1786,23 +1781,22 @@ lRet = ERROR_SUCCESS; break; } - szHandler[(sizeof(szHandler) / sizeof(szHandler[0])) - 1] = 0; - hr = CLSIDFromString(szHandler, &clsid); - if (FAILED(hr)) + + /* The CLSID is stored either in the key itself or in its default value. */ + if (FAILED(lRet = SHCLSIDFromStringW(szHandler, &clsid))) { dwClsidSize = sizeof(szClsidHandler); if (SHGetValueW(hkPropSheetHandlers, szHandler, NULL, NULL, szClsidHandler, &dwClsidSize) == ERROR_SUCCESS) { + /* Force a NULL-termination and convert the string */ szClsidHandler[(sizeof(szClsidHandler) / sizeof(szClsidHandler[0])) - 1] = 0; - hr = CLSIDFromString(szClsidHandler, &clsid); + lRet = SHCLSIDFromStringW(szClsidHandler, &clsid); } } - if (SUCCEEDED(hr)) + + if (SUCCEEDED(lRet)) { - IShellExtInit *psxi; - IShellPropSheetExt *pspsx; - - /* Attempt to get an IShellPropSheetExt and an IShellExtInit instance. + /* Attempt to get an IShellPropSheetExt and an IShellExtInit instance. Only if both interfaces are supported it's a real shell extension. Then call IShellExtInit's Initialize method. */ if (SUCCEEDED(CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID *)&pspsx))) @@ -1814,7 +1808,14 @@ /* Add the IShellPropSheetExt instance to the array */ psxa->pspsx[psxa->uiCount++] = pspsx; } + else + { + psxi->lpVtbl->Release(psxi); + pspsx->lpVtbl->Release(pspsx); + } } + else + pspsx->lpVtbl->Release(pspsx); } }
@@ -1883,7 +1884,7 @@ psxa->pspsx[i]->lpVtbl->Release(psxa->pspsx[i]); }
- LocalFree((HLOCAL)psxa); + LocalFree(psxa); } }
@@ -1896,7 +1897,7 @@ LPCITEMIDLIST pidlFolder, UINT cpidlFiles, LPCITEMIDLIST *lppidlFiles, - IDataObject **ppdataObject) + LPDATAOBJECT *ppdataObject) { UINT i; HWND hwnd = 0; /*FIXME: who should be hwnd of owner? set to desktop */ @@ -1906,8 +1907,7 @@ if (TRACE_ON(pidl)) { pdump (pidlFolder); - for (i = 0; i < cpidlFiles; i++) - pdump(lppidlFiles[i]); + for (i=0; i<cpidlFiles; i++) pdump (lppidlFiles[i]); } hResult = IDataObject_Constructor(hwnd, pidlFolder, lppidlFiles, cpidlFiles, ppdataObject); return hResult; @@ -1934,33 +1934,9 @@
IEnumFORMATETC_AddRef(pef); hRes = IEnumFORMATETC_QueryInterface(pef, &IID_IEnumFORMATETC, (LPVOID*)ppenumFormatetc); - - return hRes; -} - - -/************************************************************************* - * SHCreateShellFolderView (SHELL32.256) - */ -HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv) -{ - IShellView *psf; - HRESULT hRes; - - *ppsv = NULL; - if (!pcsfv || pcsfv->cbSize != sizeof(*pcsfv)) - return E_INVALIDARG; - - TRACE("sf=%p outer=%p callback=%p\n", - pcsfv->pshf, pcsfv->psvOuter, pcsfv->psfvcb); - - hRes = IShellView_Constructor(pcsfv->pshf, &psf); - if (FAILED(hRes)) - return hRes; - - hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppsv); - - return hRes; + IEnumFORMATETC_Release(pef); + + return hRes; }
/************************************************************************* @@ -2095,6 +2071,173 @@
return S_OK; } +/************************************************************************* + * SHSetLocalizedName (SHELL32.@) + */ +HRESULT WINAPI SHSetLocalizedName(LPCWSTR pszPath, LPCWSTR pszResModule, int idsRes) +{ + FIXME("%p, %s, %d - stub\n", pszPath, debugstr_w(pszResModule), idsRes); + + return S_OK; +} + +/************************************************************************* + * LinkWindow_RegisterClass (SHELL32.258) + */ +BOOL WINAPI LinkWindow_RegisterClass(void) +{ + FIXME("()\n"); + return TRUE; +} + +/************************************************************************* + * LinkWindow_UnregisterClass (SHELL32.259) + */ +BOOL WINAPI LinkWindow_UnregisterClass(void) +{ + FIXME("()\n"); + return TRUE; +} + +/************************************************************************* + * SHFlushSFCache (SHELL32.526) + * + * Notifies the shell that a user-specified special folder location has changed. + * + * NOTES + * In Wine, the shell folder registry values are not cached, so this function + * has no effect. + */ +void WINAPI SHFlushSFCache(void) +{ +} + +/************************************************************************* + * SHGetImageList (SHELL32.727) + * + * Returns a copy of a shell image list. + * + * NOTES + * Windows XP features 4 sizes of image list, and Vista 5. Wine currently + * only supports the traditional small and large image lists, so requests + * for the others will currently fail. + */ +HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) +{ + HIMAGELIST hLarge, hSmall; + HIMAGELIST hNew; + HRESULT ret = E_FAIL; + + /* Wine currently only maintains large and small image lists */ + if ((iImageList != SHIL_LARGE) && (iImageList != SHIL_SMALL) && (iImageList != SHIL_SYSSMALL)) + { + FIXME("Unsupported image list %i requested\n", iImageList); + return E_FAIL; + } + + Shell_GetImageLists(&hLarge, &hSmall); +#ifndef __REACTOS__ + hNew = ImageList_Duplicate(iImageList == SHIL_LARGE ? hLarge : hSmall); + + /* Get the interface for the new image list */ + if (hNew) + { + ret = HIMAGELIST_QueryInterface(hNew, riid, ppv); + ImageList_Destroy(hNew); + } +#else + /* Duplicating the imagelist causes the start menu items not to draw on + * the first show. Was the Duplicate necessary for some reason? I believe + * Windows returns the raw pointer here. */ + hNew = (iImageList == SHIL_LARGE ? hLarge : hSmall); + ret = IImageList2_QueryInterface((IImageList2 *) hNew, riid, ppv); +#endif + + return ret; +} + +/************************************************************************* + * SHCreateShellFolderView [SHELL32.256] + * + * Create a new instance of the default Shell folder view object. + * + * RETURNS + * Success: S_OK + * Failure: error value + * + * NOTES + * see IShellFolder::CreateViewObject + */ +HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, + IShellView **ppsv) +{ + IShellView * psf; + HRESULT hRes; + + *ppsv = NULL; + if (!pcsfv || pcsfv->cbSize != sizeof(*pcsfv)) + return E_INVALIDARG; + + TRACE("sf=%p outer=%p callback=%p\n", + pcsfv->pshf, pcsfv->psvOuter, pcsfv->psfvcb); + + hRes = IShellView_Constructor(pcsfv->pshf, &psf); + if (FAILED(hRes)) + return hRes; + + hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppsv); + IShellView_Release(psf); + + return hRes; +} + +/************************************************************************* + * PathIsTemporaryA [SHELL32.713] + */ +BOOL WINAPI PathIsTemporaryA(LPSTR Str) +{ + FIXME("(%s)stub\n", debugstr_a(Str)); + return FALSE; +} + +/************************************************************************* + * SHParseDisplayName [shell version 6.0] + */ +HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, + LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut) +{ + IShellFolder *psfDesktop; + HRESULT hr=E_FAIL; + ULONG dwAttr=sfgaoIn; + + if(!ppidl) + return E_INVALIDARG; + + if (!pszName || !psfgaoOut) + { + *ppidl = NULL; + return E_INVALIDARG; + } + + hr = SHGetDesktopFolder(&psfDesktop); + if (FAILED(hr)) + { + *ppidl = NULL; + return hr; + } + + hr = IShellFolder_ParseDisplayName(psfDesktop, (HWND)NULL, pbc, (LPOLESTR)pszName, (ULONG *)NULL, ppidl, &dwAttr); + + IShellFolder_Release(psfDesktop); + + if (SUCCEEDED(hr)) + *psfgaoOut = dwAttr; + else + *ppidl = NULL; + + return hr; +} + /************************************************************************* * SHEmptyRecycleBinA (SHELL32.@) */ @@ -2225,126 +2368,3 @@
return S_OK; } - -/************************************************************************* - * SHSetLocalizedName (SHELL32.@) - */ -EXTERN_C HRESULT WINAPI SHSetLocalizedName(LPCWSTR pszPath, LPCWSTR pszResModule, int idsRes) -{ - FIXME("%p, %s, %d - stub\n", pszPath, debugstr_w(pszResModule), idsRes); - - return S_OK; -} - -/************************************************************************* - * LinkWindow_RegisterClass (SHELL32.258) - */ -EXTERN_C BOOL WINAPI LinkWindow_RegisterClass(void) -{ - FIXME("()\n"); - return TRUE; -} - -/************************************************************************* - * LinkWindow_UnregisterClass (SHELL32.259) - */ -EXTERN_C BOOL WINAPI LinkWindow_UnregisterClass(void) -{ - FIXME("()\n"); - return TRUE; -} - -/************************************************************************* - * SHFlushSFCache (SHELL32.526) - * - * Notifies the shell that a user-specified special folder location has changed. - * - * NOTES - * In Wine, the shell folder registry values are not cached, so this function - * has no effect. - */ -EXTERN_C void WINAPI SHFlushSFCache(void) -{ -} - -/************************************************************************* - * SHGetImageList (SHELL32.727) - * - * Returns a copy of a shell image list. - * - * NOTES - * Windows XP features 4 sizes of image list, and Vista 5. Wine currently - * only supports the traditional small and large image lists, so requests - * for the others will currently fail. - */ -EXTERN_C HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) -{ - HIMAGELIST hLarge, hSmall; - HIMAGELIST hNew; - HRESULT ret = E_FAIL; - - /* Wine currently only maintains large and small image lists */ - if ((iImageList != SHIL_LARGE) && (iImageList != SHIL_SMALL) && (iImageList != SHIL_SYSSMALL)) - { - FIXME("Unsupported image list %i requested\n", iImageList); - return E_FAIL; - } - - Shell_GetImageLists(&hLarge, &hSmall); -#ifndef __REACTOS__ - hNew = ImageList_Duplicate(iImageList == SHIL_LARGE ? hLarge : hSmall); - - /* Get the interface for the new image list */ - if (hNew) - { - ret = HIMAGELIST_QueryInterface(hNew, riid, ppv); - ImageList_Destroy(hNew); - } -#else - /* Duplicating the imagelist causes the start menu items not to draw on - * the first show. Was the Duplicate necessary for some reason? I believe - * Windows returns the raw pointer here. */ - hNew = (iImageList == SHIL_LARGE ? hLarge : hSmall); - ret = IImageList2_QueryInterface((IImageList2 *) hNew, riid, ppv); -#endif - - return ret; -} - -/************************************************************************* - * SHParseDisplayName [shell version 6.0] - */ -EXTERN_C HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, - LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut) -{ - IShellFolder *psfDesktop; - HRESULT hr=E_FAIL; - ULONG dwAttr=sfgaoIn; - - if(!ppidl) - return E_INVALIDARG; - - if (!pszName || !psfgaoOut) - { - *ppidl = NULL; - return E_INVALIDARG; - } - - hr = SHGetDesktopFolder(&psfDesktop); - if (FAILED(hr)) - { - *ppidl = NULL; - return hr; - } - - hr = IShellFolder_ParseDisplayName(psfDesktop, (HWND)NULL, pbc, (LPOLESTR)pszName, (ULONG *)NULL, ppidl, &dwAttr); - - IShellFolder_Release(psfDesktop); - - if (SUCCEEDED(hr)) - *psfgaoOut = dwAttr; - else - *ppidl = NULL; - - return hr; -}