这是我做一个从窗口向windows explore拖放文件时碰到的。通过调用COleDataSource.DoDropDrag来拖动文件对应的图标把文件move或copy到windows explore,但明明产生的是DROPEFFECT_MOVE效果(也就是不带加号的小方块),但该函数最后的返回值却是DROPEFFECT_NONE,这跟往其他不接受拖拽的地方返回的是一样的结果啊。程序中,如果是DROPEFFECT_MOVE,我要删除对应的图标,如果是DROPEFFECT_NONE,我啥也不做。而现在我必须使用下面的类似的代码:
网上查了下,搜到如下原因(来自:http://hi.baidu.com/0xeb/blog/item/287e16d2df7f4b073af3cf9b.html/cmtid/189df42b4fb1ad96023bf620):
在Windows NT 4.0以上的系统中,即使实际产生的是DROPEFFECT_MOVE动作,DoDragDrop函数也只返回DROPEFFECT_NONE。产生这个问题的原因在于,Windows NT 4.0的Shell会直接移动文件本身来对移动操作进行优化。返回值DROPEFFECT_MOVE最初的含义,就是通知执行拖放操作的应用程序去删除原位置上的文件。但是因为Shell已经替应用程序完成了这个(删除)动作,所以,函数返回DROPEFFECT_NONE。要想知道文件是否真的被移动了也很简单,只要在函数返回之后检查一下原位置上的文件是否存在就可以了。
Windows 9x系列的操作系统也会对移动进行同样的优化动作,但是它不会返回DROPEFFECT_NONE来代替DROPEFFECT_MOVE。详细的解释参见MS知识库Q182219。