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

5 c# drag-and-drop windows-explorer istorage istream

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

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

然后我发现要通过这个IStreamIStorage关闭到Windows资源管理器,我必须得到它STGMEDIUM.当然,medium.tymed将是IStream或者IStorage,取决于我正在使用的,但据我所知,它medium.unionmember必须是指向的IStream/IStorage.

我已经使用固定的关键字(但它不是blittable当然),我试过只是诅咒的东西转换成字节数组试过,但不能想出一个办法做到这一点,我已经试过使用GCHandle来固定它(但它仍然不是blittable),以及其他一些不起作用的东西.

所以我的问题是这样的:给定IStorage sSTGMEDIUM m,我如何填充,m.unionmember以便Windows资源管理器很高兴并接受丢弃?

Pav*_*aev 2

StructLayout.Explicit通常,C 联合在 C# 中使用表示。然而,这可能不适用于您的情况 - 虽然您可以像这样覆盖IStreamIStorage引用,但编组器将尝试编组两者。您最好的选择可能是仅按照IntPtr您的声明中的方式声明该字段STGMEDIUM,并使用Marshal.GetIUnknownForObject它来初始化它。