WINE_DEFAULT_DEBUG_CHANNEL(mydocs);
-static CLIPFORMAT g_cfHIDA = 0;
-
CMyDocsDropHandler::CMyDocsDropHandler()
{
InterlockedIncrement(&g_ModuleRefCnt);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
- // get the clipboard format
- if (g_cfHIDA == 0)
- g_cfHIDA = ::RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
-
// Retrieve an HIDA (handle of IDA)
- STGMEDIUM medium;
- FORMATETC fmt = { g_cfHIDA, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
- hr = pDataObject->GetData(&fmt, &medium);
- if (FAILED_UNEXPECTEDLY(hr))
+ CDataObjectHIDA pida(pDataObject);
+ if (FAILED_UNEXPECTEDLY(pida.hr()))
{
*pdwEffect = 0;
DragLeave();
- return E_FAIL;
+ return pida.hr();
}
- // lock HIDA
- LPIDA pida = reinterpret_cast<LPIDA>(GlobalLock(medium.hGlobal));
UINT iItem, cItems = pida->cidl;
// get the path of "My Documents"
// for all source items
CStringW strSrcList;
WCHAR szSrc[MAX_PATH];
- const BYTE *pb = reinterpret_cast<BYTE *>(pida);
- PCIDLIST_ABSOLUTE pidlParent = reinterpret_cast<PCIDLIST_ABSOLUTE>(pb + pida->aoffset[0]);
+ PCIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pida);
for (iItem = 0; iItem < cItems; ++iItem)
{
// query source pidl
- PCITEMID_CHILD pidlChild = reinterpret_cast<PCITEMID_CHILD>(pb + pida->aoffset[iItem + 1]);
+ PCITEMID_CHILD pidlChild = HIDA_GetPIDLItem(pida, iItem);
CComHeapPtr<ITEMIDLIST> pidl(ILCombine(pidlParent, pidlChild));
// can get path?
strSrcList += szSrc;
}
- // unlock HIDA
- GlobalUnlock(medium.hGlobal);
-
if (iItem != cItems)
{
// source not found
fileop.pFrom = pszzSrcList;
fileop.pTo = szzDir;
fileop.fFlags = FOF_ALLOWUNDO | FOF_FILESONLY | FOF_MULTIDESTFILES | FOF_NOCONFIRMMKDIR;
- SHFileOperationW(&fileop);
+ int res = SHFileOperationW(&fileop);
+ if (res)
+ {
+ ERR("SHFileOperationW failed with 0x%x\n", res);
+ hr = E_FAIL;
+ }
// unlock buffer
strSrcList.ReleaseBuffer();