| 471 | } |
| 472 | |
| 473 | HRESULT CopyFilesToClipboard( |
| 474 | const std::list<std::wstring> &FileNameList, BOOL bMove, IDataObject **pClipboardDataObject) |
| 475 | { |
| 476 | FORMATETC ftc[2]; |
| 477 | STGMEDIUM stg[2]; |
| 478 | BuildHDropList(&ftc[0], &stg[0], FileNameList); |
| 479 | |
| 480 | ftc[1].cfFormat = (CLIPFORMAT) RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT); |
| 481 | ftc[1].ptd = NULL; |
| 482 | ftc[1].dwAspect = DVASPECT_CONTENT; |
| 483 | ftc[1].lindex = -1; |
| 484 | ftc[1].tymed = TYMED_HGLOBAL; |
| 485 | |
| 486 | HRESULT hr = E_FAIL; |
| 487 | HGLOBAL hglb = GlobalAlloc(GMEM_MOVEABLE, sizeof(DWORD)); |
| 488 | |
| 489 | if (hglb != NULL) |
| 490 | { |
| 491 | auto *pdwCopyEffect = static_cast<DWORD *>(GlobalLock(hglb)); |
| 492 | |
| 493 | if (pdwCopyEffect != NULL) |
| 494 | { |
| 495 | if (bMove) |
| 496 | { |
| 497 | *pdwCopyEffect = DROPEFFECT_MOVE; |
| 498 | } |
| 499 | else |
| 500 | { |
| 501 | *pdwCopyEffect = DROPEFFECT_COPY; |
| 502 | } |
| 503 | |
| 504 | GlobalUnlock(hglb); |
| 505 | |
| 506 | stg[1].pUnkForRelease = NULL; |
| 507 | stg[1].hGlobal = hglb; |
| 508 | stg[1].tymed = TYMED_HGLOBAL; |
| 509 | |
| 510 | *pClipboardDataObject = CreateDataObject(ftc, stg, 2); |
| 511 | |
| 512 | IDataObjectAsyncCapability *pAsyncCapability = NULL; |
| 513 | hr = (*pClipboardDataObject)->QueryInterface(IID_PPV_ARGS(&pAsyncCapability)); |
| 514 | |
| 515 | if (SUCCEEDED(hr)) |
| 516 | { |
| 517 | pAsyncCapability->SetAsyncMode(TRUE); |
| 518 | pAsyncCapability->Release(); |
| 519 | |
| 520 | hr = OleSetClipboard(*pClipboardDataObject); |
| 521 | } |
| 522 | } |
| 523 | } |
| 524 | |
| 525 | return hr; |
| 526 | } |
| 527 | |
| 528 | int PasteLinksToClipboardFiles(const TCHAR *szDestination) |
| 529 | { |
no test coverage detected