- Create IDataObject from the selected pidl

- Check if drop target is the desktop
- fixes bug 3763

svn path=/trunk/; revision=37363
This commit is contained in:
Johannes Anderwald 2008-11-14 19:48:46 +00:00
parent 782931f369
commit 0c5b1ec2bc

View file

@ -1054,9 +1054,19 @@ DoPaste(
return E_FAIL; return E_FAIL;
} }
if (This->dcm.cidl)
{
IShellFolder_Release(psfDesktop); 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"); ERR("no IShellFolder\n");
@ -1309,9 +1319,16 @@ DoCopyOrCut(
{ {
LPSHELLBROWSER lpSB; LPSHELLBROWSER lpSB;
LPSHELLVIEW lpSV; LPSHELLVIEW lpSV;
LPDATAOBJECT lpDo; LPDATAOBJECT pDataObj;
HRESULT hr; 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); lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0);
if (!lpSB) if (!lpSB)
{ {
@ -1326,19 +1343,19 @@ DoCopyOrCut(
return hr; 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)) if (FAILED(hr))
{ {
TRACE("failed to get item object\n"); TRACE("failed to get item object\n");
return hr; return hr;
} }
hr = OleSetClipboard(lpDo); hr = OleSetClipboard(pDataObj);
if (FAILED(hr)) if (FAILED(hr))
{ {
WARN("OleSetClipboard failed"); WARN("OleSetClipboard failed");
} }
IDataObject_Release(lpDo); IDataObject_Release(pDataObj);
IShellView_Release(lpSV); IShellView_Release(lpSV);
return S_OK; return S_OK;
} }