我一直在研究听起来很简单的功能,时间已经太久了。这个想法是我有一个带有TreeView的应用程序。该树形 View 表示组织为文件和文件夹的数据库内容,非常类似于Windows资源管理器。因此,用户应该能够将这些文件/文件夹拖出我的应用程序并拖入Windows资源管理器。

我决定如果他们拖动文件,则应使用IStream;如果他们拖动文件夹,则应使用IStorage。经过漫长的时间和学习方式,比我想了解的Win32/COM(以及这里一位很有帮助的人的插入力)多得多,我终于创建了IStreamIStorage

然后,我发现要将此IStreamIStorage传递给Windows资源管理器,我必须将其转换为STGMEDIUM。当然,medium.tymed可以是IStreamIStorage,具体取决于我使用的是哪个,但据我所知,medium.unionmember必须是IStream/IStorage的指针。

我已经尝试过使用fixed关键字(当然,它不是可blittable的),我已经尝试过将爆炸内容转换为字节数组,但是无法找到实现该目的的方法,我已经尝试过使用GCHandle固定它(但是它仍然是不可蓝变的),以及其他一些无效的东西。

所以我的问题是这样的:给定IStorage sSTGMEDIUM m,如何填充m.unionmember,以便Windows资源管理器满意并接受删除?

最佳答案

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

09-26 20:07