mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 14:53:40 +00:00
[SHELL32]
- CDefaultContextMenu: Simplify some really superfluous code and add more checks for bogus parameters. Create the data object using GetUIObjectOf instead of SHCreateDataObject. Each sell folder should be able to use its own special data object. svn path=/trunk/; revision=72775
This commit is contained in:
parent
32705690e7
commit
05f4321160
1 changed files with 36 additions and 158 deletions
|
@ -176,8 +176,6 @@ CDefaultContextMenu::~CDefaultContextMenu()
|
||||||
|
|
||||||
HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm)
|
HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm)
|
||||||
{
|
{
|
||||||
CComPtr<IDataObject> pDataObj;
|
|
||||||
|
|
||||||
TRACE("cidl %u\n", pdcm->cidl);
|
TRACE("cidl %u\n", pdcm->cidl);
|
||||||
|
|
||||||
m_cidl = pdcm->cidl;
|
m_cidl = pdcm->cidl;
|
||||||
|
@ -186,8 +184,7 @@ HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
m_psf = pdcm->psf;
|
m_psf = pdcm->psf;
|
||||||
|
|
||||||
if (SUCCEEDED(SHCreateDataObject(pdcm->pidlFolder, pdcm->cidl, pdcm->apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj))))
|
m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
|
||||||
m_pDataObj = pDataObj;
|
|
||||||
|
|
||||||
if (pdcm->pidlFolder)
|
if (pdcm->pidlFolder)
|
||||||
{
|
{
|
||||||
|
@ -399,26 +396,17 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsi
|
||||||
|
|
||||||
CComPtr<IContextMenu> pcm;
|
CComPtr<IContextMenu> pcm;
|
||||||
hr = SHCoCreateInstance(NULL, pclsid, NULL, IID_PPV_ARG(IContextMenu, &pcm));
|
hr = SHCoCreateInstance(NULL, pclsid, NULL, IID_PPV_ARG(IContextMenu, &pcm));
|
||||||
if (hr != S_OK)
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
|
||||||
ERR("SHCoCreateInstance failed %x\n", GetLastError());
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
|
|
||||||
CComPtr<IShellExtInit> pExtInit;
|
CComPtr<IShellExtInit> pExtInit;
|
||||||
hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
|
hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
|
||||||
if (hr != S_OK)
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
|
||||||
ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
|
|
||||||
hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
|
hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
|
||||||
if (hr != S_OK)
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
|
||||||
TRACE("Failed to initialize shell extension error %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
|
|
||||||
PDynamicShellEntry pEntry = (DynamicShellEntry *)HeapAlloc(GetProcessHeap(), 0, sizeof(DynamicShellEntry));
|
PDynamicShellEntry pEntry = (DynamicShellEntry *)HeapAlloc(GetProcessHeap(), 0, sizeof(DynamicShellEntry));
|
||||||
if (!pEntry)
|
if (!pEntry)
|
||||||
|
@ -997,15 +985,12 @@ CDefaultContextMenu::QueryContextMenu(
|
||||||
HRESULT
|
HRESULT
|
||||||
CDefaultContextMenu::NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh)
|
CDefaultContextMenu::NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh)
|
||||||
{
|
{
|
||||||
CComPtr<IShellView> psv;
|
|
||||||
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
if (!m_site)
|
if (!m_site)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
/* Get a pointer to the shell browser */
|
/* Get a pointer to the shell browser */
|
||||||
hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
CComPtr<IShellView> psv;
|
||||||
|
HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
@ -1015,9 +1000,8 @@ CDefaultContextMenu::NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRe
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
|
||||||
CDefaultContextMenu::DoRefresh(
|
HRESULT CDefaultContextMenu::DoRefresh(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
LPCMINVOKECOMMANDINFO lpcmi)
|
|
||||||
{
|
{
|
||||||
if (!m_site)
|
if (!m_site)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
@ -1031,63 +1015,15 @@ CDefaultContextMenu::DoRefresh(
|
||||||
return psv->Refresh();
|
return psv->Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT CDefaultContextMenu::DoPaste(LPCMINVOKECOMMANDINFO lpcmi, BOOL bLink)
|
||||||
CDefaultContextMenu::DoPaste(
|
|
||||||
LPCMINVOKECOMMANDINFO lpcmi, BOOL bLink)
|
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
CComPtr<IDataObject> pda;
|
CComPtr<IDataObject> pda;
|
||||||
hr = OleGetClipboard(&pda);
|
hr = OleGetClipboard(&pda);
|
||||||
if (FAILED(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
CComPtr<IShellFolder> psfDesktop;
|
|
||||||
CComPtr<IShellFolder> psfTarget = NULL;
|
|
||||||
|
|
||||||
hr = SHGetDesktopFolder(&psfDesktop);
|
|
||||||
if (FAILED(hr))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
/* Find target folder */
|
|
||||||
if (m_cidl)
|
|
||||||
{
|
|
||||||
hr = m_psf->BindToObject(m_apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfTarget));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CComPtr<IPersistFolder2> ppf2 = NULL;
|
|
||||||
LPITEMIDLIST pidl;
|
|
||||||
|
|
||||||
/* cidl is zero due to explorer view */
|
|
||||||
hr = m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
hr = ppf2->GetCurFolder(&pidl);
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
if (_ILIsDesktop(pidl))
|
|
||||||
{
|
|
||||||
/* use desktop shellfolder */
|
|
||||||
psfTarget = psfDesktop;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* retrieve target desktop folder */
|
|
||||||
hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfTarget));
|
|
||||||
}
|
|
||||||
TRACE("psfTarget %x %p, Desktop %u\n", hr, psfTarget.p, _ILIsDesktop(pidl));
|
|
||||||
ILFree(pidl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
ERR("no IShellFolder\n");
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORMATETC formatetc2;
|
FORMATETC formatetc2;
|
||||||
STGMEDIUM medium2;
|
STGMEDIUM medium2;
|
||||||
InitFormatEtc(formatetc2, RegisterClipboardFormatW(CFSTR_PREFERREDDROPEFFECT), TYMED_HGLOBAL);
|
InitFormatEtc(formatetc2, RegisterClipboardFormatW(CFSTR_PREFERREDDROPEFFECT), TYMED_HGLOBAL);
|
||||||
|
@ -1116,12 +1052,13 @@ CDefaultContextMenu::DoPaste(
|
||||||
}
|
}
|
||||||
|
|
||||||
CComPtr<IDropTarget> pdrop;
|
CComPtr<IDropTarget> pdrop;
|
||||||
hr = psfTarget->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
|
if (m_cidl)
|
||||||
if (FAILED(hr))
|
hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
|
||||||
{
|
else
|
||||||
ERR("Error getting IDropTarget interface\n");
|
hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
|
||||||
|
|
||||||
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
|
|
||||||
SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
|
SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
|
||||||
|
|
||||||
|
@ -1130,113 +1067,63 @@ CDefaultContextMenu::DoPaste(
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
CDefaultContextMenu::DoOpenOrExplore(
|
CDefaultContextMenu::DoOpenOrExplore(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
LPCMINVOKECOMMANDINFO lpcmi)
|
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT CDefaultContextMenu::DoCreateLink(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
CDefaultContextMenu::DoCreateLink(
|
|
||||||
LPCMINVOKECOMMANDINFO lpcmi)
|
|
||||||
{
|
{
|
||||||
CComPtr<IDataObject> pDataObj;
|
if (!m_cidl || !m_pDataObj)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
CComPtr<IDropTarget> pDT;
|
CComPtr<IDropTarget> pDT;
|
||||||
HRESULT hr;
|
HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
|
||||||
CComPtr<IPersistFolder2> ppf2 = NULL;
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
LPITEMIDLIST pidl;
|
|
||||||
CComPtr<IShellFolder> psfDesktop;
|
|
||||||
CComPtr<IShellFolder> psfTarget = NULL;
|
|
||||||
|
|
||||||
hr = SHGetDesktopFolder(&psfDesktop);
|
|
||||||
if (FAILED(hr))
|
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (SUCCEEDED(hr = SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj))))
|
SHSimulateDrop(pDT, m_pDataObj, MK_CONTROL|MK_SHIFT, NULL, NULL);
|
||||||
{
|
|
||||||
hr = m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
hr = ppf2->GetCurFolder(&pidl);
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
if (_ILIsDesktop(pidl))
|
|
||||||
{
|
|
||||||
/* use desktop shellfolder */
|
|
||||||
psfTarget = psfDesktop;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* retrieve target desktop folder */
|
|
||||||
hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfTarget));
|
|
||||||
}
|
|
||||||
TRACE("psfTarget %x %p, Desktop %u\n", hr, psfTarget.p, _ILIsDesktop(pidl));
|
|
||||||
ILFree(pidl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
ERR("no IShellFolder\n");
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = psfTarget->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
ERR("no IDropTarget Interface\n");
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
SHSimulateDrop(pDT, pDataObj, MK_CONTROL|MK_SHIFT, NULL, NULL);
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi)
|
HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
{
|
{
|
||||||
|
if (!m_cidl || !m_pDataObj)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
DoDeleteAsync(m_pDataObj, lpcmi->fMask);
|
DoDeleteAsync(m_pDataObj, lpcmi->fMask);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT CDefaultContextMenu::DoCopyOrCut(LPCMINVOKECOMMANDINFO lpcmi, BOOL bCopy)
|
||||||
CDefaultContextMenu::DoCopyOrCut(
|
|
||||||
LPCMINVOKECOMMANDINFO lpcmi,
|
|
||||||
BOOL bCopy)
|
|
||||||
{
|
{
|
||||||
CComPtr<IDataObject> pDataObj;
|
if (!m_cidl || !m_pDataObj)
|
||||||
HRESULT hr;
|
return E_FAIL;
|
||||||
|
|
||||||
hr = SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj));
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
if (!bCopy)
|
if (!bCopy)
|
||||||
{
|
{
|
||||||
FORMATETC formatetc;
|
FORMATETC formatetc;
|
||||||
STGMEDIUM medium;
|
STGMEDIUM medium;
|
||||||
InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_PREFERREDDROPEFFECT), TYMED_HGLOBAL);
|
InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_PREFERREDDROPEFFECT), TYMED_HGLOBAL);
|
||||||
pDataObj->GetData(&formatetc, &medium);
|
m_pDataObj->GetData(&formatetc, &medium);
|
||||||
DWORD * pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
|
DWORD * pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
|
||||||
if (pdwFlag)
|
if (pdwFlag)
|
||||||
*pdwFlag = DROPEFFECT_MOVE;
|
*pdwFlag = DROPEFFECT_MOVE;
|
||||||
GlobalUnlock(medium.hGlobal);
|
GlobalUnlock(medium.hGlobal);
|
||||||
pDataObj->SetData(&formatetc, &medium, TRUE);
|
m_pDataObj->SetData(&formatetc, &medium, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OleSetClipboard(pDataObj);
|
return OleSetClipboard(m_pDataObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT CDefaultContextMenu::DoRename(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
CDefaultContextMenu::DoRename(
|
|
||||||
LPCMINVOKECOMMANDINFO lpcmi)
|
|
||||||
{
|
{
|
||||||
CComPtr<IShellBrowser> psb;
|
CComPtr<IShellBrowser> psb;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if (!m_site)
|
if (!m_site || !m_cidl)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
/* Get a pointer to the shell browser */
|
/* Get a pointer to the shell browser */
|
||||||
|
@ -1244,15 +1131,6 @@ CDefaultContextMenu::DoRename(
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
/* is the treeview focused */
|
|
||||||
HWND hwnd;
|
|
||||||
if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwnd)))
|
|
||||||
{
|
|
||||||
HTREEITEM hItem = TreeView_GetSelection(hwnd);
|
|
||||||
if (hItem)
|
|
||||||
(void)TreeView_EditLabel(hwnd, hItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
CComPtr<IShellView> lpSV;
|
CComPtr<IShellView> lpSV;
|
||||||
hr = psb->QueryActiveShellView(&lpSV);
|
hr = psb->QueryActiveShellView(&lpSV);
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue