From ae35d576779d4062c70f2d999aa445a8a0edbf07 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 3 Nov 2014 18:09:50 +0000 Subject: [PATCH] [SHELL32] * Move shellord.cpp to the wine folder. * Convert shellord.cpp into shellord.c. CORE-8540 svn path=/branches/shell-experiments/; revision=65229 --- dll/win32/shell32/CMakeLists.txt | 2 +- .../shell32/{shellord.cpp => wine/shellord.c} | 134 +++++++++++------- 2 files changed, 85 insertions(+), 51 deletions(-) rename dll/win32/shell32/{shellord.cpp => wine/shellord.c} (94%) diff --git a/dll/win32/shell32/CMakeLists.txt b/dll/win32/shell32/CMakeLists.txt index ab6a5090e15..5f6592e3090 100644 --- a/dll/win32/shell32/CMakeLists.txt +++ b/dll/win32/shell32/CMakeLists.txt @@ -43,7 +43,6 @@ list(APPEND SOURCE shell32.cpp shellitem.cpp shelllink.cpp - shellord.cpp shellreg.cpp folders/desktop.cpp folders/fs.cpp @@ -75,6 +74,7 @@ add_library(shell32 SHARED wine/control.c wine/shell32_main.c wine/shellole.c + wine/shellord.c wine/shellpath.c wine/shellstring.c wine/shpolicy.c diff --git a/dll/win32/shell32/shellord.cpp b/dll/win32/shell32/wine/shellord.c similarity index 94% rename from dll/win32/shell32/shellord.cpp rename to dll/win32/shell32/wine/shellord.c index 7f395029f30..44f5d5b8901 100644 --- a/dll/win32/shell32/shellord.cpp +++ b/dll/win32/shell32/wine/shellord.c @@ -20,20 +20,51 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "precomp.h" +#include -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COBJMACROS + +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + +#include +#include + +#include "pidl.h" +#include "shell32_main.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DECLARE_DEBUG_CHANNEL(pidl); -/* FIXME: !!! move flags to header file !!! */ +/* FIXME: !!! move CREATEMRULIST and flags to header file !!! */ +/* !!! it is in both here and comctl32undoc.c !!! */ +typedef struct tagCREATEMRULIST +{ + DWORD cbSize; /* size of struct */ + DWORD nMaxItems; /* max no. of items in list */ + DWORD dwFlags; /* see below */ + HKEY hKey; /* root reg. key under which list is saved */ + LPCSTR lpszSubKey; /* reg. subkey */ + int (CALLBACK *lpfnCompare)(LPCVOID, LPCVOID, DWORD); /* item compare proc */ +} CREATEMRULISTA, *LPCREATEMRULISTA; + /* dwFlags */ #define MRUF_STRING_LIST 0 /* list will contain strings */ #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); @@ -53,7 +84,6 @@ EXTERN_C INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, /* Function pointers for GET_FUNC macro */ static HMODULE SHELL32_hshlwapi=NULL; - /************************************************************************* * ParseFieldA [internal] * @@ -668,7 +698,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) CHAR new_lnk_filepath[MAX_PATH]; CHAR new_lnk_name[MAX_PATH]; CHAR * ext; - CComPtr ppM; + IMalloc *ppM; LPITEMIDLIST pidl; HWND hwnd = 0; /* FIXME: get real window handle */ INT ret; @@ -727,7 +757,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) if (SUCCEEDED(SHGetSpecialFolderLocation(hwnd, CSIDL_RECENT, &pidl))) { SHGetPathFromIDListA(pidl, link_dir); - ppM->Free(pidl); + IMalloc_Free(ppM, pidl); } else { /* serious issues */ @@ -805,9 +835,10 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) ext = strrchr(doc_name, '.'); if (!lstrcmpiA(ext, ".lnk")) { - CComPtr ShellLink; - IShellLink_ConstructFromFile(NULL, IID_IShellLinkA, (LPCITEMIDLIST)SHSimpleIDListFromPathA(doc_name), (LPVOID*)&ShellLink); - ShellLink->GetPath(doc_name, MAX_PATH, NULL, 0); + IShellLinkA* ShellLink; + IShellLink_ConstructFromFile(NULL, &IID_IShellLinkA, (LPCITEMIDLIST)SHSimpleIDListFromPathA(doc_name), (LPVOID*)&ShellLink); + IShellLinkA_GetPath(ShellLink, doc_name, MAX_PATH, NULL, 0); + IShellLinkA_Release(ShellLink); } ext = strrchr(doc_name, '.'); @@ -847,7 +878,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) mymru.dwFlags = MRUF_BINARY_LIST | MRUF_DELAYED_SAVE; mymru.hKey = HCUbasekey; mymru.lpszSubKey = "RecentDocs"; - mymru.lpfnCompare = (PROC)SHADD_compare_mru; + mymru.lpfnCompare = SHADD_compare_mru; mruhandle = CreateMRUListA(&mymru); if (!mruhandle) { /* MRU failed */ @@ -931,21 +962,22 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) * uFlags[in] - flags on call to SHAddToRecentDocs * pv[in] - document path/pidl on call to SHAddToRecentDocs */ - CComPtr psl; - CComPtr pPf; + IShellLinkA *psl = NULL; + IPersistFile *pPf = NULL; HRESULT hres; CHAR desc[MAX_PATH]; WCHAR widelink[MAX_PATH]; CoInitialize(0); - hres = CoCreateInstance(CLSID_ShellLink, + hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - IID_PPV_ARG(IShellLinkA,&psl)); + &IID_IShellLinkA, + (LPVOID )&psl); if(SUCCEEDED(hres)) { - hres = psl->QueryInterface(IID_PPV_ARG(IPersistFile,&pPf)); + hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile, (LPVOID *)&pPf); if(FAILED(hres)) { /* bombed */ ERR("failed QueryInterface for IPersistFile %08x\n", hres); @@ -954,9 +986,9 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) /* Set the document path or pidl */ if (uFlags == SHARD_PIDL) { - hres = psl->SetIDList((LPCITEMIDLIST) pv); + hres = IShellLinkA_SetIDList(psl, pv); } else { - hres = psl->SetPath((LPCSTR) pv); + hres = IShellLinkA_SetPath(psl, pv); } if(FAILED(hres)) { /* bombed */ @@ -966,7 +998,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) lstrcpyA(desc, "Shortcut to "); lstrcatA(desc, doc_name); - hres = psl->SetDescription(desc); + hres = IShellLinkA_SetDescription(psl, desc); if(FAILED(hres)) { /* bombed */ ERR("failed SetDescription %08x\n", hres); @@ -976,13 +1008,13 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) MultiByteToWideChar(CP_ACP, 0, new_lnk_filepath, -1, widelink, MAX_PATH); /* create the short cut */ - hres = pPf->Save(widelink, TRUE); + hres = IPersistFile_Save(pPf, widelink, TRUE); if(FAILED(hres)) { /* bombed */ ERR("failed IPersistFile::Save %08x\n", hres); goto fail; } - hres = pPf->SaveCompleted(widelink); + hres = IPersistFile_SaveCompleted(pPf, widelink); TRACE("shortcut %s has been created, result=%08x\n", new_lnk_filepath, hres); } @@ -1015,7 +1047,7 @@ HRESULT WINAPI SHCreateShellFolderViewEx( LPCSFV psvcbi, /* [in] shelltemplate struct */ IShellView **ppv) /* [out] IShellView pointer */ { - CComPtr psf; + IShellView * psf; HRESULT hRes; TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n", @@ -1027,7 +1059,7 @@ HRESULT WINAPI SHCreateShellFolderViewEx( if (FAILED(hRes)) return hRes; - hRes = psf->QueryInterface(IID_PPV_ARG(IShellView, ppv)); + hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv); return hRes; } @@ -1074,7 +1106,7 @@ HRESULT WINAPI SHGetInstanceExplorer (IUnknown **lpUnknown) if (!SHELL32_IExplorerInterface) return E_FAIL; - SHELL32_IExplorerInterface->AddRef(); + IUnknown_AddRef(SHELL32_IExplorerInterface); return S_OK; } /************************************************************************* @@ -1341,7 +1373,7 @@ BOOL WINAPI IsUserAnAdmin(VOID) * * See shlwapi.SHAllocShared */ -HANDLE WINAPI SHAllocShared(LPVOID lpvData, DWORD dwSize, DWORD dwProcId) +HANDLE WINAPI SHAllocShared(LPCVOID lpvData, DWORD dwSize, DWORD dwProcId) { typedef HANDLE (WINAPI *SHAllocSharedProc)(LPCVOID, DWORD, DWORD); static SHAllocSharedProc pSHAllocShared; @@ -1689,7 +1721,7 @@ UINT WINAPI SHAddFromPropSheetExtArray(HPSXA hpsxa, LPFNADDPROPSHEETPAGE lpfnAdd /* Call the AddPage method of all registered IShellPropSheetExt interfaces */ for (i = 0; i != psxa->uiCount; i++) { - psxa->pspsx[i]->AddPages(PsxaCall, (LPARAM)&Call); + psxa->pspsx[i]->lpVtbl->AddPages(psxa->pspsx[i], PsxaCall, (LPARAM)&Call); } return Call.uiCount; @@ -1772,20 +1804,20 @@ EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, } if (SUCCEEDED(hr)) { - CComPtr psxi; - CComPtr pspsx; + IShellExtInit *psxi; + IShellPropSheetExt *pspsx; /* 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_PPV_ARG(IShellPropSheetExt, &pspsx)))) + if (SUCCEEDED(CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID *)&pspsx))) { - if (SUCCEEDED(pspsx->QueryInterface(IID_PPV_ARG(IShellExtInit, &psxi)))) + if (SUCCEEDED(pspsx->lpVtbl->QueryInterface(pspsx, &IID_IShellExtInit, (PVOID *)&psxi))) { - if (SUCCEEDED(psxi->Initialize(NULL, pDataObj, hKey))) + if (SUCCEEDED(psxi->lpVtbl->Initialize(psxi, NULL, pDataObj, hKey))) { /* Add the IShellPropSheetExt instance to the array */ - psxa->pspsx[psxa->uiCount++] = pspsx.Detach(); + psxa->pspsx[psxa->uiCount++] = pspsx; } } } @@ -1829,7 +1861,7 @@ UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPRO for (i = 0; i != psxa->uiCount; i++) { Call.bCalled = FALSE; - psxa->pspsx[i]->ReplacePage(uPageID, PsxaCall, (LPARAM)&Call); + psxa->pspsx[i]->lpVtbl->ReplacePage(psxa->pspsx[i], uPageID, PsxaCall, (LPARAM)&Call); } return Call.uiCount; @@ -1852,7 +1884,7 @@ void WINAPI SHDestroyPropSheetExtArray(HPSXA hpsxa) { for (i = 0; i != psxa->uiCount; i++) { - psxa->pspsx[i]->Release(); + psxa->pspsx[i]->lpVtbl->Release(psxa->pspsx[i]); } LocalFree((HLOCAL)psxa); @@ -1896,7 +1928,7 @@ HRESULT WINAPI SHCreateStdEnumFmtEtc( const FORMATETC *lpFormats, LPENUMFORMATETC *ppenumFormatetc) { - CComPtr pef; + IEnumFORMATETC *pef; HRESULT hRes; TRACE("cf=%d fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc); @@ -1904,8 +1936,8 @@ HRESULT WINAPI SHCreateStdEnumFmtEtc( if (FAILED(hRes)) return hRes; - pef->AddRef(); - hRes = pef->QueryInterface(IID_PPV_ARG(IEnumFORMATETC, ppenumFormatetc)); + IEnumFORMATETC_AddRef(pef); + hRes = IEnumFORMATETC_QueryInterface(pef, &IID_IEnumFORMATETC, (LPVOID*)ppenumFormatetc); return hRes; } @@ -1916,7 +1948,7 @@ HRESULT WINAPI SHCreateStdEnumFmtEtc( */ HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv) { - CComPtr psf; + IShellView *psf; HRESULT hRes; *ppsv = NULL; @@ -1930,7 +1962,7 @@ HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **pps if (FAILED(hRes)) return hRes; - hRes = psf->QueryInterface(IID_PPV_ARG(IShellView, ppsv)); + hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppsv); return hRes; } @@ -2267,20 +2299,22 @@ EXTERN_C HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) } Shell_GetImageLists(&hLarge, &hSmall); - - // 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 = /*ImageList_Duplicate*/(iImageList == SHIL_LARGE ? hLarge : hSmall); +#ifndef __REACTOS__ + hNew = ImageList_Duplicate(iImageList == SHIL_LARGE ? hLarge : hSmall); /* Get the interface for the new image list */ if (hNew) { - IImageList *imageList = reinterpret_cast(hNew); - ret = imageList->QueryInterface(riid, ppv); - - // Since we are not duplicating, destroying makes no sense. - /* ImageList_Destroy(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; } @@ -2291,7 +2325,7 @@ EXTERN_C HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) EXTERN_C HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut) { - CComPtr psfDesktop; + IShellFolder *psfDesktop; HRESULT hr=E_FAIL; ULONG dwAttr=sfgaoIn; @@ -2311,9 +2345,9 @@ EXTERN_C HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, return hr; } - hr = psfDesktop->ParseDisplayName((HWND)NULL, pbc, (LPOLESTR)pszName, (ULONG *)NULL, ppidl, &dwAttr); + hr = IShellFolder_ParseDisplayName(psfDesktop, (HWND)NULL, pbc, (LPOLESTR)pszName, (ULONG *)NULL, ppidl, &dwAttr); - psfDesktop->Release(); + IShellFolder_Release(psfDesktop); if (SUCCEEDED(hr)) *psfgaoOut = dwAttr;