继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??

gfvera gfvera 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在 DoDragDrop中返回值为DRAGDROP_S_DROP,但是却没有移动文件???我的代码哪里写错了????

下面这个是我在鼠标移动时的代码。。。 。。

其中CIDropSource和CIDataObject的类在这里下载代码。。。Download source - 3.8 Kb
http://www.codeproject.com/Articles/12342/Drag-and-Drop-Listbox-Items-using-OLE


bool CImageItem::DragDropTo2(QString path, int DropStyle)
{
OleInitialize(NULL); // needed for Drag and Drop

CIDropSource* src = new CIDropSource;
if (src == nullptr) return false;

CIDataObject* obje = new CIDataObject(src);
if (obje == nullptr)
{
OleUninitialize();
delete src;
return false;
}

FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
STGMEDIUM dest = { TYMED_HGLOBAL, { 0 }, 0 };

stgmed.hGlobal = GlobalAlloc(GMEM_MOVEABLE, strlen(path.toLatin1().data()) + 1);
char *pChar = (char *)GlobalLock(stgmed.hGlobal);
strcpy(pChar, path.toLatin1().data());
GlobalUnlock(stgmed.hGlobal);

obje->CopyMedium(&dest, &stgmed, &fmtetc);

DWORD dwEffect;
DWORD dwResult;
dwResult = DoDragDrop(obje, src, DROPEFFECT_COPY | DROPEFFECT_MOVE, &dwEffect);
if (dwResult == DRAGDROP_S_DROP)
{
//通过调试输出,这里是成功的。
OutputDebugString(L"[3dh] ok");
if (dwEffect & DROPEFFECT_MOVE)
{
//这里并没有过来。。。。
OutputDebugString(L"[3dh] ok2");
}
}
else if (dwResult == DRAGDROP_S_CANCEL)
{
OutputDebugString(L"[3dh] no");
}

//正常来说这里应该有上面两个指针的Release()。但是如果Release会崩掉。。。这是问题2.。。。
if (obje != null)
obje->Release() //崩溃。

if (src != null)
src->.RElease();


OleUninitialize();
return true;
}
...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
gfvera
ATL 3,248 成员 48,530 内容