我开始尝试使用this codeproject tutorial实现虚拟文件(来自C#4 / WPF应用程序)的拖放。花了一些时间trying to figure out a DV_E_FORMATETC错误后,我发现我需要支持“Shell IDList Array”数据格式。但是关于这种格式实际上做了什么,似乎只有零文档。
经过一番搜索后,我发现this page on advanced data transfer表示Shell IDList Array是指向CIDA structure的指针。然后,此CIDA结构包含PIDL的数量以及它们的偏移列表。那究竟是什么PIDL?经过一些搜索后,this page表示它是指向ITEMIDLIST的指针,SHITEMID本身包含一个this page列表的成员。
我做了一些阅读,我仍然无法分辨多个PIDL是什么,但路径中的每个“级别”都有一个SHITEMID。至少这是一个谜团。
我的下一个想法是尝试使用虚拟文件(WinSCP)从另一个应用程序拖动文件。我刚刚为这种格式安装了一个MemoryStream。至少我知道要为这个东西提供什么类,但这根本不能解释放入它的内容。我尝试根据上面链接中的格式检查这个MemoryStream,但是我没有成功。我刚拿回垃圾数据,其中一个'cb'字段告诉我,当整个流只有539字节时,它的长度为18000字节。
此外,在进一步阅读时,PipeStream似乎暗示PIDL中包含的数据实际上是一个路径,并且在十六进制编辑器中检查所述MemoryStream的内容在我的本地Temp内部产生一条路径目录(无论如何分成几部分)。
似乎WinSCP只使用shell扩展来处理在资源管理器上的丢弃,这是我真的不想诉诸的东西。但是,它有一个替代模式,它会中止dragdrop,直到它转移到临时文件夹 - 这对我来说是可以接受的,但我不知道如何做到这一点。
我现在的问题是:
任何帮助甚至可以解释我应该做什么的链接都将不胜感激。
编辑:所以这就是我最终实际做到的方式:
我从上面的CodeProject教程中删除了大部分代码,保留了创建FileGroupDescriptor的功能。然后我重新实现了.Net IDataObject接口(实际上,我根本不必使用COM IDataObject接口)。然后我被迫在后台同步下载文件,并从GetData()传回MemoryStream。方便的是,实际的复制在后台,但等待数据在前台。谢谢,探险家。任何相当大的文件都很慢,但是现在它“有效”,这比我过去几周所说的还多。
我确实尝试传递我在内部用于传输的{{3}}类,但是资源管理器对此并不满意:
所以,我不确定理想的情况是否真的可行。不过,谢谢你的帮助。我正在给予JPW赏金,因为他的回复最终让我走上了正确的道路。
答案 0 :(得分:3)
我认为http://www.codeproject.com/KB/miscctrl/FileBrowser.aspx上的 C#文件浏览器可以为您提供最大程度的帮助。
这些文章非常宝贵。
C#执行Shell,第1部分 http://www.codeproject.com/KB/shell/csdoesshell1.aspx
C#执行Shell,第2部分 http://www.codeproject.com/KB/shell/csdoesshell2.aspx
C#执行Shell,第3部分 http://www.codeproject.com/KB/shell/csdoesshell3.aspx
C#执行Shell,第4部分 http://www.codeproject.com/KB/shell/csdoesshell4.spx
Edanmo.ShellExtensions是绝对必须拥有的。 http://www.mvps.org/emorcillo/en/code/shell/shellextensions.shtml
请注意,其中一些COM接口已在.NET 2.0中定义。 (我没有检查4.0,但我怀疑微软是否添加了对Shell / COM接口的任何额外支持。)
完整的白痴编写Shell扩展指南 - 索引 ,作者:Michael Dunn,白痴指南中所有文章的索引来自http://www.codeproject.com/KB/shell/shellextguideindex.aspx(这些文章对我帮助最大。)
完整的白痴编写命名空间扩展指南 - 第一部分 http://www.codeproject.com/kb/shell/namespcextguide1.aspx。你在找什么?
答案 1 :(得分:2)
免责声明:我既不是Windows Shell编程专家也不是COM编程专家,特别是使用.NET的COM编程专家。
免责声明2 :Shell编程相当复杂,Windows资源管理器可能会崩溃。 (请务必阅读有关调试shell扩展的MSDN上的信息。)
我可以提供回答您的问题:
我希望有些信息对您有用。
编辑:您还可以适当地实现QueryGetData和EnumerableFormatEtc,以指示您的对象不支持相关格式。也许Windows资源管理器会尝试不同的格式。
编辑2 :虽然您已经确定了一个解决方案,但这里有一些关于如何异步拖放(对于大型文件)的信息,也许是您(或者至少有人在寻找)对于一个关于simulary问题的答案,谁读这个)发现它很有用:http://msdn.microsoft.com/en-us/library/bb776904(VS.85).aspx#async
答案 2 :(得分:0)