From 0c5b1ec2bc2006a53eda60f15f5bbd7755491f44 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 14 Nov 2008 19:48:46 +0000 Subject: [PATCH] - Create IDataObject from the selected pidl - Check if drop target is the desktop - fixes bug 3763 svn path=/trunk/; revision=37363 --- reactos/dll/win32/shell32/shv_def_cmenu.c | 29 ++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/shell32/shv_def_cmenu.c b/reactos/dll/win32/shell32/shv_def_cmenu.c index 3336ba521cf..2a31c11eab9 100644 --- a/reactos/dll/win32/shell32/shv_def_cmenu.c +++ b/reactos/dll/win32/shell32/shv_def_cmenu.c @@ -1054,9 +1054,19 @@ DoPaste( return E_FAIL; } - IShellFolder_Release(psfDesktop); + if (This->dcm.cidl) + { + IShellFolder_Release(psfDesktop); + hr = IShellFolder_BindToObject(This->dcm.psf, This->dcm.apidl[0], NULL, &IID_IShellFolder, (LPVOID*)&psfTarget); + } + else + { + /* target folder is desktop because cidl is zero */ + psfTarget = psfDesktop; + hr = S_OK; + } - if (FAILED(IShellFolder_BindToObject(This->dcm.psf, This->dcm.apidl[0], NULL, &IID_IShellFolder, (LPVOID*)&psfTarget))) + if (FAILED(hr)) { ERR("no IShellFolder\n"); @@ -1309,9 +1319,16 @@ DoCopyOrCut( { LPSHELLBROWSER lpSB; LPSHELLVIEW lpSV; - LPDATAOBJECT lpDo; + LPDATAOBJECT pDataObj; HRESULT hr; + if (SUCCEEDED(SHCreateDataObject(iface->dcm.pidlFolder, iface->dcm.cidl, iface->dcm.apidl, NULL, &IID_IDataObject, (void**)&pDataObj))) + { + hr = OleSetClipboard(pDataObj); + IDataObject_Release(pDataObj); + return hr; + } + lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0); if (!lpSB) { @@ -1326,19 +1343,19 @@ DoCopyOrCut( return hr; } - hr = IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo); + hr = IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&pDataObj); if (FAILED(hr)) { TRACE("failed to get item object\n"); return hr; } - hr = OleSetClipboard(lpDo); + hr = OleSetClipboard(pDataObj); if (FAILED(hr)) { WARN("OleSetClipboard failed"); } - IDataObject_Release(lpDo); + IDataObject_Release(pDataObj); IShellView_Release(lpSV); return S_OK; }