VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1415|回复: 6

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

[复制链接]
28_avatar_middle
在线会员 发表于 2016-3-17 12:18:58 | 显示全部楼层 |阅读模式
在 DoDragDrop中返回值为DRAGDROP_S_DROP,但是却没有移动文件???我的代码哪里写错了????

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

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

  1. bool CImageItem::DragDropTo2(QString path, int DropStyle)
  2. {
  3.     OleInitialize(NULL);    // needed for Drag and Drop
  4.       
  5.     CIDropSource* src = new CIDropSource;
  6.     if (src == nullptr) return false;
  7.       
  8.     CIDataObject* obje = new CIDataObject(src);
  9.     if (obje == nullptr)
  10.     {
  11.         OleUninitialize();
  12.         delete src;
  13.         return false;
  14.     }
  15.       
  16.     FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
  17.     STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
  18.     STGMEDIUM dest = { TYMED_HGLOBAL, { 0 }, 0 };

  19.     stgmed.hGlobal = GlobalAlloc(GMEM_MOVEABLE, strlen(path.toLatin1().data()) + 1);
  20.     char *pChar = (char *)GlobalLock(stgmed.hGlobal);
  21.     strcpy(pChar, path.toLatin1().data());
  22.     GlobalUnlock(stgmed.hGlobal);
  23.       
  24.     obje->CopyMedium(&dest, &stgmed, &fmtetc);
  25.          
  26.     DWORD        dwEffect;
  27.     DWORD        dwResult;  
  28.     dwResult = DoDragDrop(obje, src, DROPEFFECT_COPY | DROPEFFECT_MOVE, &dwEffect);
  29.     if (dwResult == DRAGDROP_S_DROP)
  30.     {
  31.       //通过调试输出,这里是成功的。
  32.         OutputDebugString(L"[3dh] ok");
  33.         if (dwEffect & DROPEFFECT_MOVE)
  34.         {
  35.              //这里并没有过来。。。。
  36.             OutputDebugString(L"[3dh] ok2");
  37.         }
  38.     }
  39.     else if (dwResult == DRAGDROP_S_CANCEL)
  40.     {
  41.         OutputDebugString(L"[3dh] no");
  42.     }

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

  46.       if (src  != null)
  47.           src->.RElease();
  48.      
  49.       
  50.     OleUninitialize();
  51.     return true;
  52. }
复制代码




上一篇:如何获取当前进程打开的文件名?
下一篇:运行指定的应用程序打不开 还有别的API可以打开吗
51_avatar_middle
online_admins 发表于 2016-3-17 13:12:49 | 显示全部楼层
貌似楼主使用的不对吧?
原版的解释是:

Here is a quick explanation of what each of these classes do. COleDataSource is the class that holds the data that will be transferred from the source to the destination. COleDropSource is a relatively small class that gives visual feedback during the Drag and Drop operation. And finally, COleDropTarget is the class that handles everything on the destination side of things. In reality, most people will only use COleDataSource and COleDropTarget, since most people don't need to change the behavior of COleDropSource, and it is automatically created by the COleDataSource.

The drag and drop operation consists of the source object creating a COleDataSource, attaching some data to it, and calling the DoDragDrop method of the COleDataSource object. The destination object would have to implement a COleDropTarget class. The COleDropTarget class has a handful of virtual functions that get called during the operation: OnDragEnter, OnDragOver, OnDragLeave, and OnDrop are the most important ones. These methods must be overwritten so that we can tell the system what to do.

所以,COleDataSource 是不用集成,看楼主代码应该继承了吧。

看原版工程的示例代码:
  1. void CMyDragAndDropWnd::StartDrag()
  2. {
  3.    //create the COleDataSource, and attach the data to it
  4.    COleDataSource DataSource;

  5.    //create a chunck of memory that will hold "This is a test" 15 chars
  6.    HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE,15);
  7.    char *pChar = (char *)GlobalLock(hData);
  8.    strcpy(pChar,"This is a test");
  9.    GlobalUnlock(hData);

  10.    if (hData)
  11.    {
  12.       //attach the data to the COleDataSource Object
  13.       DataSource.CacheGlobalData(CF_TEXT,hData);

  14.       //allow the user to drag it.
  15.       DROPEFFECT DropEffect =
  16.          DataSource.DoDragDrop(GetDragItemEffects(m_DraggedIndex));

  17.       //Once DoDragDrop returns we can check the return value stored in DropEffect
  18.       //to see what kind of dropping happened. Like move, copy or shortcut
  19.    }
  20. }
复制代码


都是使用一个 DataSource 对象去 CacheGlobalData,去 DoDragDrop。
而楼主的代码,一会用 obje->CopyMedium 去拷贝数据,而 DoDragDrop 的时候确是使用的 this 对象的,所以是不是有点不妥啊。。。
28_avatar_middle
ico_lz  楼主| 发表于 2016-3-17 14:23:13 | 显示全部楼层
Syc 发表于 2016-3-17 13:12
貌似楼主使用的不对吧?
原版的解释是:

晕。。。。。COleDataSource  是MFC类

但是我这个并不是要在MFC中使用的啊。。。。。。。继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??

管理员知道知道如何使用SDK实现吗。。。。 如果知道麻烦告知下。。

哎。。这东西先用动态DLL实现试试。。。。。继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??
51_avatar_middle
online_admins 发表于 2016-3-17 15:17:39 | 显示全部楼层
crow_sky 发表于 2016-3-17 14:23
晕。。。。。COleDataSource  是MFC类

但是我这个并不是要在MFC中使用的啊。。。。。。。

SDK 实现的可以参考以下一些文章,应该可以解决楼主的问题:

Windows Shell 扩展编程 第十五章
http://blog.csdn.net/chchzh/article/details/4597866

Drag Drop Win API 32
http://stackoverflow.com/questions/13576225/drag-drop-win-api-32

第三部分:IDataObject实现
http://blog.sina.com.cn/s/blog_5f8817250100sf6l.html

第四部分:IDropSource实现
http://blog.sina.com.cn/s/blog_5f8817250100sion.html

第五部分:IDropTarget实现
http://blog.sina.com.cn/s/blog_5f8817250100siqx.html
28_avatar_middle
ico_lz  楼主| 发表于 2016-3-17 17:35:55 | 显示全部楼层
搞好了。。
http://blog.csdn.net/qazwsxwtc/article/details/44279529  
28_avatar_middle
ico_lz  楼主| 发表于 2016-3-17 17:36:45 | 显示全部楼层
Syc 发表于 2016-3-17 15:17
SDK 实现的可以参考以下一些文章,应该可以解决楼主的问题:

Windows Shell 扩展编程 第十五章

真难得,都这么多年了。。没想到管理员还是这么有热情啊哈哈
51_avatar_middle
online_admins 发表于 2016-3-17 17:50:41 | 显示全部楼层
crow_sky 发表于 2016-3-17 17:36
真难得,都这么多年了。。没想到管理员还是这么有热情啊哈哈

继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-21 13:48

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表