diff --git a/reactos/dll/win32/shell32/CDefView.cpp b/reactos/dll/win32/shell32/CDefView.cpp index 09cd0aa1b0b..27fcb44da77 100644 --- a/reactos/dll/win32/shell32/CDefView.cpp +++ b/reactos/dll/win32/shell32/CDefView.cpp @@ -3153,15 +3153,49 @@ HRESULT CDefView::_MergeToolbar() return S_OK; } -/********************************************************** - * IShellView_Constructor - */ -HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView) -{ - return ShellObjectCreatorInit(pFolder, IID_PPV_ARG(IShellView, newView)); -} -HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut) +HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut) { return ShellObjectCreatorInit(pFolder, riid, ppvOut); } + +HRESULT WINAPI SHCreateShellFolderViewEx( + LPCSFV psvcbi, /* [in] shelltemplate struct */ + IShellView **ppsv) /* [out] IShellView pointer */ +{ + CComPtr psv; + HRESULT hRes; + + TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n", + psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback, + psvcbi->fvm, psvcbi->psvOuter); + + *ppsv = NULL; + hRes = CDefView_CreateInstance(psvcbi->pshf, IID_PPV_ARG(IShellView, &psv)); + if (FAILED_UNEXPECTEDLY(hRes)) + return hRes; + + *ppsv = psv.Detach(); + return hRes; +} + +HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, + IShellView **ppsv) +{ + CComPtr psv; + 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 = CDefView_CreateInstance(pcsfv->pshf, IID_PPV_ARG(IShellView, &psv)); + if (FAILED(hRes)) + return hRes; + + *ppsv = psv.Detach(); + return hRes; +} diff --git a/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp b/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp index 03abfe66af2..62540ab7cb9 100644 --- a/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp @@ -394,7 +394,8 @@ HRESULT WINAPI CControlPanelFolder::CreateViewObject(HWND hwndOwner, REFIID riid WARN("IContextMenu not implemented\n"); hr = E_NOTIMPL; } else if (IsEqualIID(riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } } TRACE("--(%p)->(interface=%p)\n", this, ppvOut); diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp index 7a81c9f71e1..cf1656fc4b4 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp @@ -514,7 +514,6 @@ HRESULT WINAPI CDesktopFolder::CreateViewObject( REFIID riid, LPVOID *ppvOut) { - CComPtr pShellView; HRESULT hr = E_INVALIDARG; TRACE ("(%p)->(hwnd=%p,%s,%p)\n", @@ -549,9 +548,8 @@ HRESULT WINAPI CDesktopFolder::CreateViewObject( } else if (IsEqualIID (riid, IID_IShellView)) { - hr = IShellView_Constructor((IShellFolder *)this, &pShellView); - if (pShellView) - hr = pShellView->QueryInterface(riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut); return hr; diff --git a/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp b/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp index 2280cfbed9c..1accb7a8b26 100644 --- a/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp @@ -531,7 +531,8 @@ HRESULT WINAPI CDrivesFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVO } else if (IsEqualIID(riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut); return hr; diff --git a/reactos/dll/win32/shell32/folders/CFSFolder.cpp b/reactos/dll/win32/shell32/folders/CFSFolder.cpp index e4487cad1d4..518877bc2fc 100644 --- a/reactos/dll/win32/shell32/folders/CFSFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CFSFolder.cpp @@ -393,7 +393,8 @@ HRESULT WINAPI CFSFolder::CreateViewObject(HWND hwndOwner, } else if (IsEqualIID (riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } } TRACE("-- (%p)->(interface=%p)\n", this, ppvOut); diff --git a/reactos/dll/win32/shell32/folders/CNetFolder.cpp b/reactos/dll/win32/shell32/folders/CNetFolder.cpp index 2bbd358ebed..b0bfdce1dc9 100644 --- a/reactos/dll/win32/shell32/folders/CNetFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CNetFolder.cpp @@ -362,7 +362,8 @@ HRESULT WINAPI CNetFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID } else if (IsEqualIID(riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } TRACE("-- (%p)->(interface=%p)\n", this, ppvOut); return hr; diff --git a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp index 1448d258f31..85a89680f00 100644 --- a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp @@ -285,7 +285,8 @@ HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPV } else if(IsEqualIID(riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppvOut); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); } TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut); return hr; diff --git a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp index e866203b091..853c81ef757 100644 --- a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp @@ -564,7 +564,8 @@ HRESULT WINAPI CRecycleBin::CreateViewObject(HWND hwndOwner, REFIID riid, void * } else if (IsEqualIID (riid, IID_IShellView)) { - hr = CDefView_Constructor(this, riid, ppv); + SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; + hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppv); } else return hr; diff --git a/reactos/dll/win32/shell32/wine/shell32_main.h b/reactos/dll/win32/shell32/wine/shell32_main.h index 66a98592efb..489ad42fe39 100644 --- a/reactos/dll/win32/shell32/wine/shell32_main.h +++ b/reactos/dll/win32/shell32/wine/shell32_main.h @@ -69,8 +69,6 @@ IContextMenu2 * ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pid HRESULT WINAPI INewItem_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); IContextMenu2 * ISvStaticItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *apidl, UINT cidl, HKEY hKey); IContextMenu2 * ISvBgCm_Constructor(LPSHELLFOLDER pSFParent, BOOL bDesktop); -HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView); -HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut); HRESULT WINAPI CDefViewDual_Constructor(REFIID riid, LPVOID * ppvOut); HRESULT WINAPI CShellDispatch_Constructor(REFIID riid, LPVOID * ppvOut); diff --git a/reactos/dll/win32/shell32/wine/shellord.c b/reactos/dll/win32/shell32/wine/shellord.c index df2c5205a99..cf5796ee486 100644 --- a/reactos/dll/win32/shell32/wine/shellord.c +++ b/reactos/dll/win32/shell32/wine/shellord.c @@ -1046,6 +1046,8 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) * NOTES * see IShellFolder::CreateViewObject */ + #ifndef __REACTOS__ + HRESULT WINAPI SHCreateShellFolderViewEx( LPCSFV psvcbi, /* [in] shelltemplate struct */ IShellView **ppv) /* [out] IShellView pointer */ @@ -1068,6 +1070,8 @@ HRESULT WINAPI SHCreateShellFolderViewEx( return hRes; } +#endif + /************************************************************************* * SHWinHelp [SHELL32.127] * @@ -2108,6 +2112,8 @@ HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) return ret; } +#ifndef __REACTOS__ + /************************************************************************* * SHCreateShellFolderView [SHELL32.256] * @@ -2142,3 +2148,4 @@ HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, return hRes; } +#endif