我一直在研究听起来很简单的功能,时间已经太久了。这个想法是我有一个带有TreeView的应用程序。该树形 View 表示组织为文件和文件夹的数据库内容,非常类似于Windows资源管理器。因此,用户应该能够将这些文件/文件夹拖出我的应用程序并拖入Windows资源管理器。
我决定如果他们拖动文件,则应使用IStream
;如果他们拖动文件夹,则应使用IStorage
。经过漫长的时间和学习方式,比我想了解的Win32/COM(以及这里一位很有帮助的人的插入力)多得多,我终于创建了IStream
或IStorage
。
然后,我发现要将此IStream
或IStorage
传递给Windows资源管理器,我必须将其转换为STGMEDIUM
。当然,medium.tymed可以是IStream
或IStorage
,具体取决于我使用的是哪个,但据我所知,medium.unionmember
必须是IStream/IStorage
的指针。
我已经尝试过使用fixed关键字(当然,它不是可blittable的),我已经尝试过将爆炸内容转换为字节数组,但是无法找到实现该目的的方法,我已经尝试过使用GCHandle固定它(但是它仍然是不可蓝变的),以及其他一些无效的东西。
所以我的问题是这样的:给定IStorage s
和STGMEDIUM m
,如何填充m.unionmember
,以便Windows资源管理器满意并接受删除?
最佳答案
通常,C联合使用C#中的StructLayout.Explicit
表示。但是,这可能不适用于您的情况-尽管您可以像这样叠加IStream
和IStorage
引用,但编码器将尝试将两者编码(marshal)。最好的选择可能是在IntPtr
声明中将字段声明为STGMEDIUM
,然后使用Marshal.GetIUnknownForObject
对其进行初始化。