使用IStorage / IStream从C#拖放到Windows资源管理器

时间:2009-08-14 21:08:20

标签: c# drag-and-drop windows-explorer istream istorage

我一直在研究听起来像简单功能的东西。我的想法是我有一个带有TreeView的应用程序。此树视图表示组织到文件和文件夹中的数据库的内容,非常类似于Windows资源管理器。因此,用户应该能够将这些文件/文件夹拖出我的应用程序并进入Windows资源管理器。

如果他们拖动文件,我决定使用IStream,如果他们拖动文件夹,我应该使用IStorage。经过很长一段时间和学习方式比我想知道的Win32 / COM(以及来自这里非常有帮助的人的推动),我终于创建了IStreamIStorage

然后我发现要将此IStreamIStorage传递给Windows资源管理器,我必须在STGMEDIUM中获取它。当然,medium.tymed将是IStreamIStorage,具体取决于我使用的是什么,但据我所知,medium.unionmember必须是指向{{1}的指针}}

我尝试过使用fixed关键字(但当然不是blittable),我尝试过将爆破的事物转换为字节数组,但是无法想出办法来实现这一点,我我曾尝试使用GCHandle来固定它(但它仍然没有闪现),以及其他一些不起作用的东西。

所以我的问题是这样:给定IStream/IStorageIStorage s,如何填充STGMEDIUM m以便Windows资源管理器会满意并接受丢弃?

2 个答案:

答案 0 :(得分:2)

通常,在C#中使用StructLayout.Explicit表示C联合。但是,这可能不适用于您的情况 - 虽然您可以覆盖IStreamIStorage这样的引用,但是编组人员会尝试编组两者。您最好的选择可能是在IntPtr声明中将该字段声明为STGMEDIUM,并使用Marshal.GetIUnknownForObject进行初始化。

答案 1 :(得分:0)

我认为这个主题已经过时了,但是任何寻找文件拖放的人都会查看这个讨论,特别是dbirdz的帖子:http://www.daniweb.com/forums/thread166429.html

在我看来,这甚至适用于这个应用程序,我会尝试将我的流写入临时文件,然后可以将其移动到其位置。