summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
768eecf)
* Move shellord.cpp to the wine folder.
* Convert shellord.cpp into shellord.c.
CORE-8540
svn path=/branches/shell-experiments/; revision=65229
shell32.cpp
shellitem.cpp
shelllink.cpp
shell32.cpp
shellitem.cpp
shelllink.cpp
shellreg.cpp
folders/desktop.cpp
folders/fs.cpp
shellreg.cpp
folders/desktop.cpp
folders/fs.cpp
wine/control.c
wine/shell32_main.c
wine/shellole.c
wine/control.c
wine/shell32_main.c
wine/shellole.c
wine/shellpath.c
wine/shellstring.c
wine/shpolicy.c
wine/shellpath.c
wine/shellstring.c
wine/shpolicy.c
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "precomp.h"
-
-#include <mmsystem.h>
+#include <wine/config.h>
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COBJMACROS
+
+#include <windef.h>
+#include <winbase.h>
+#include <winternl.h>
+#include <shlobj.h>
+#include <undocshell.h>
+#include <shlwapi.h>
+#include <commdlg.h>
#include <commoncontrols.h>
#include <commoncontrols.h>
+#include <recyclebin.h>
+#include <mmsystem.h>
+
+#include <wine/debug.h>
+#include <wine/unicode.h>
+
+#include "pidl.h"
+#include "shell32_main.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
WINE_DECLARE_DEBUG_CHANNEL(pidl);
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 */
/* 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);
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);
/* Function pointers for GET_FUNC macro */
static HMODULE SHELL32_hshlwapi=NULL;
/* Function pointers for GET_FUNC macro */
static HMODULE SHELL32_hshlwapi=NULL;
/*************************************************************************
* ParseFieldA [internal]
*
/*************************************************************************
* ParseFieldA [internal]
*
CHAR new_lnk_filepath[MAX_PATH];
CHAR new_lnk_name[MAX_PATH];
CHAR * ext;
CHAR new_lnk_filepath[MAX_PATH];
CHAR new_lnk_name[MAX_PATH];
CHAR * ext;
LPITEMIDLIST pidl;
HWND hwnd = 0; /* FIXME: get real window handle */
INT ret;
LPITEMIDLIST pidl;
HWND hwnd = 0; /* FIXME: get real window handle */
INT ret;
if (SUCCEEDED(SHGetSpecialFolderLocation(hwnd, CSIDL_RECENT,
&pidl))) {
SHGetPathFromIDListA(pidl, link_dir);
if (SUCCEEDED(SHGetSpecialFolderLocation(hwnd, CSIDL_RECENT,
&pidl))) {
SHGetPathFromIDListA(pidl, link_dir);
+ IMalloc_Free(ppM, pidl);
}
else {
/* serious issues */
}
else {
/* serious issues */
ext = strrchr(doc_name, '.');
if (!lstrcmpiA(ext, ".lnk"))
{
ext = strrchr(doc_name, '.');
if (!lstrcmpiA(ext, ".lnk"))
{
- CComPtr<IShellLinkA> 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, '.');
}
ext = strrchr(doc_name, '.');
mymru.dwFlags = MRUF_BINARY_LIST | MRUF_DELAYED_SAVE;
mymru.hKey = HCUbasekey;
mymru.lpszSubKey = "RecentDocs";
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 */
mruhandle = CreateMRUListA(&mymru);
if (!mruhandle) {
/* MRU failed */
* uFlags[in] - flags on call to SHAddToRecentDocs
* pv[in] - document path/pidl on call to SHAddToRecentDocs
*/
* uFlags[in] - flags on call to SHAddToRecentDocs
* pv[in] - document path/pidl on call to SHAddToRecentDocs
*/
- CComPtr<IShellLinkA> psl;
- CComPtr<IPersistFile> pPf;
+ IShellLinkA *psl = NULL;
+ IPersistFile *pPf = NULL;
HRESULT hres;
CHAR desc[MAX_PATH];
WCHAR widelink[MAX_PATH];
CoInitialize(0);
HRESULT hres;
CHAR desc[MAX_PATH];
WCHAR widelink[MAX_PATH];
CoInitialize(0);
- hres = CoCreateInstance(CLSID_ShellLink,
+ hres = CoCreateInstance(&CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
NULL,
CLSCTX_INPROC_SERVER,
- IID_PPV_ARG(IShellLinkA,&psl));
+ &IID_IShellLinkA,
+ (LPVOID )&psl);
- 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);
if(FAILED(hres)) {
/* bombed */
ERR("failed QueryInterface for IPersistFile %08x\n", hres);
/* Set the document path or pidl */
if (uFlags == SHARD_PIDL) {
/* Set the document path or pidl */
if (uFlags == SHARD_PIDL) {
- hres = psl->SetIDList((LPCITEMIDLIST) pv);
+ hres = IShellLinkA_SetIDList(psl, pv);
- hres = psl->SetPath((LPCSTR) pv);
+ hres = IShellLinkA_SetPath(psl, pv);
}
if(FAILED(hres)) {
/* bombed */
}
if(FAILED(hres)) {
/* bombed */
lstrcpyA(desc, "Shortcut to ");
lstrcatA(desc, doc_name);
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);
if(FAILED(hres)) {
/* bombed */
ERR("failed SetDescription %08x\n", hres);
MultiByteToWideChar(CP_ACP, 0, new_lnk_filepath, -1,
widelink, MAX_PATH);
/* create the short cut */
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;
}
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);
}
TRACE("shortcut %s has been created, result=%08x\n",
new_lnk_filepath, hres);
}
LPCSFV psvcbi, /* [in] shelltemplate struct */
IShellView **ppv) /* [out] IShellView pointer */
{
LPCSFV psvcbi, /* [in] shelltemplate struct */
IShellView **ppv) /* [out] IShellView pointer */
{
- CComPtr<IShellView> psf;
HRESULT hRes;
TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
HRESULT hRes;
TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
if (FAILED(hRes))
return hRes;
if (FAILED(hRes))
return hRes;
- hRes = psf->QueryInterface(IID_PPV_ARG(IShellView, ppv));
+ hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv);
if (!SHELL32_IExplorerInterface)
return E_FAIL;
if (!SHELL32_IExplorerInterface)
return E_FAIL;
- SHELL32_IExplorerInterface->AddRef();
+ IUnknown_AddRef(SHELL32_IExplorerInterface);
return S_OK;
}
/*************************************************************************
return S_OK;
}
/*************************************************************************
*
* See shlwapi.SHAllocShared
*/
*
* 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;
{
typedef HANDLE (WINAPI *SHAllocSharedProc)(LPCVOID, DWORD, DWORD);
static SHAllocSharedProc pSHAllocShared;
/* Call the AddPage method of all registered IShellPropSheetExt interfaces */
for (i = 0; i != psxa->uiCount; i++)
{
/* 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);
- CComPtr<IShellExtInit> psxi;
- CComPtr<IShellPropSheetExt> 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. */
/* 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 */
{
/* Add the IShellPropSheetExt instance to the array */
- psxa->pspsx[psxa->uiCount++] = pspsx.Detach();
+ psxa->pspsx[psxa->uiCount++] = pspsx;
for (i = 0; i != psxa->uiCount; i++)
{
Call.bCalled = FALSE;
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);
{
for (i = 0; i != psxa->uiCount; i++)
{
{
for (i = 0; i != psxa->uiCount; i++)
{
- psxa->pspsx[i]->Release();
+ psxa->pspsx[i]->lpVtbl->Release(psxa->pspsx[i]);
}
LocalFree((HLOCAL)psxa);
}
LocalFree((HLOCAL)psxa);
const FORMATETC *lpFormats,
LPENUMFORMATETC *ppenumFormatetc)
{
const FORMATETC *lpFormats,
LPENUMFORMATETC *ppenumFormatetc)
{
- CComPtr<IEnumFORMATETC> pef;
HRESULT hRes;
TRACE("cf=%d fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc);
HRESULT hRes;
TRACE("cf=%d fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc);
if (FAILED(hRes))
return hRes;
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);
*/
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
{
*/
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
{
- CComPtr<IShellView> psf;
HRESULT hRes;
*ppsv = NULL;
HRESULT hRes;
*ppsv = NULL;
if (FAILED(hRes))
return hRes;
if (FAILED(hRes))
return hRes;
- hRes = psf->QueryInterface(IID_PPV_ARG(IShellView, ppsv));
+ hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppsv);
}
Shell_GetImageLists(&hLarge, &hSmall);
}
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)
{
/* Get the interface for the new image list */
if (hNew)
{
- IImageList *imageList = reinterpret_cast<IImageList*>(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
EXTERN_C HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc,
LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
{
EXTERN_C HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc,
LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
{
- CComPtr<IShellFolder> psfDesktop;
+ IShellFolder *psfDesktop;
HRESULT hr=E_FAIL;
ULONG dwAttr=sfgaoIn;
HRESULT hr=E_FAIL;
ULONG dwAttr=sfgaoIn;
- 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);
+ IShellFolder_Release(psfDesktop);
if (SUCCEEDED(hr))
*psfgaoOut = dwAttr;
if (SUCCEEDED(hr))
*psfgaoOut = dwAttr;