gfvera fgea  2016年03月16日
继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??
在 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;
}
...全文
164 点赞 收藏 9
写回复
9 条回复

还没有回复,快来抢沙发~

发动态
发帖子
ATL
创建于2007-09-28

3022

社区成员

4.8w+

社区内容

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区公告
暂无公告