BOOL CopyFilesToClipboard( std::vector<CString> const & vecFiles )
{
RETURN_IF_FALSE_EX( FALSE, vecFiles.size() );
UINT uDropEffect = RegisterClipboardFormat(_T("Preferred DropEffect"));
HGLOBAL hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DWORD));
DWORD *pDWDropEffect = (DWORD*)GlobalLock(hGblEffect);
*pDWDropEffect = DROPEFFECT_COPY;
GlobalUnlock(hGblEffect);
DROPFILES dropFiles;
dropFiles.pFiles = sizeof(DROPFILES);
dropFiles.pt.x = 0;
dropFiles.pt.y = 0;
dropFiles.fNC = FALSE;
dropFiles.fWide = TRUE;
UINT uFileListLen = 0;
for (std::vector<CString>::const_iterator it = vecFiles.begin(); it != vecFiles.end(); ++it)
{
uFileListLen += (it->GetLength() + 1);//尾部一個\0結束符
}
UINT uGblLen = sizeof(DROPFILES) + sizeof(TCHAR)* (uFileListLen + 1);
HGLOBAL hGblFiles = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
BYTE * pData = (BYTE*)GlobalLock(hGblFiles);
memcpy(pData, (LPVOID)(&dropFiles), sizeof(DROPFILES));
BYTE *pFileList = pData + sizeof(DROPFILES);
for (std::vector<CString>::const_iterator it = vecFiles.begin(); it != vecFiles.end(); ++it)
{
UINT uLen = (it->GetLength() + 1) * sizeof(TCHAR);
memcpy(pFileList, (BYTE*)(LPCTSTR)(*it), uLen);
pFileList += uLen;
}
GlobalUnlock(hGblFiles);
if( OpenClipboard(NULL) )
{
EmptyClipboard();
SetClipboardData( CF_HDROP, hGblFiles );
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();
return TRUE;
}
else
{
::GlobalFree(hGblEffect);
::GlobalFree(hGblFiles);
}
return FALSE;
}