【问题标题】:Drag and drop from C# to Windows Explorer with IStorage/IStream使用 IStorage/IStream 从 C# 拖放到 Windows 资源管理器
【发布时间】:2009-08-14 21:08:19
【问题描述】:

我一直在研究听起来很简单的功能太久了。这个想法是我有一个带有 TreeView 的应用程序。此树视图表示组织成文件和文件夹的数据库内容,与 Windows 资源管理器非常相似。因此,用户应该能够将这些文件/文件夹从我的应用程序中拖到 Windows 资源管理器中。

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

然后我发现要将这个IStreamIStorage 传递给Windows 资源管理器,我必须在STGMEDIUM 中得到它。当然,medium.tymed 将是IStreamIStorage,这取决于我使用的是哪个,但据我了解,medium.unionmember 必须是指向IStream/IStorage 的指针。

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 谢谢!我不知道我是怎么错过 GetIUnknownForObject 的……我想我有一天要崩溃,真正弄清楚 Marshaling 是什么……
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多