我一直在研究听起来像简单功能的东西。我的想法是我有一个带有TreeView的应用程序。此树视图表示组织到文件和文件夹中的数据库的内容,非常类似于Windows资源管理器。因此,用户应该能够将这些文件/文件夹拖出我的应用程序并进入Windows资源管理器。
如果他们拖动文件,我决定使用IStream
,如果他们拖动文件夹,我应该使用IStorage
。经过很长一段时间和学习方式比我想知道的Win32 / COM(以及来自这里非常有帮助的人的推动),我终于创建了IStream
或IStorage
。
然后我发现要将此IStream
或IStorage
传递给Windows资源管理器,我必须在STGMEDIUM
中获取它。当然,medium.tymed将是IStream
或IStorage
,具体取决于我使用的是什么,但据我所知,medium.unionmember
必须是指向{{1}的指针}}
我尝试过使用fixed关键字(但当然不是blittable),我尝试过将爆破的事物转换为字节数组,但是无法想出办法来实现这一点,我我曾尝试使用GCHandle来固定它(但它仍然没有闪现),以及其他一些不起作用的东西。
所以我的问题是这样:给定IStream/IStorage
和IStorage s
,如何填充STGMEDIUM m
以便Windows资源管理器会满意并接受丢弃?
答案 0 :(得分:2)
通常,在C#中使用StructLayout.Explicit
表示C联合。但是,这可能不适用于您的情况 - 虽然您可以覆盖IStream
和IStorage
这样的引用,但是编组人员会尝试编组两者。您最好的选择可能是在IntPtr
声明中将该字段声明为STGMEDIUM
,并使用Marshal.GetIUnknownForObject
进行初始化。
答案 1 :(得分:0)
我认为这个主题已经过时了,但是任何寻找文件拖放的人都会查看这个讨论,特别是dbirdz的帖子:http://www.daniweb.com/forums/thread166429.html
在我看来,这甚至适用于这个应用程序,我会尝试将我的流写入临时文件,然后可以将其移动到其位置。