我想问的问题是:
(1)如果我通过剪贴板课与剪贴板进行交互,那么应该在"嵌入源"和#34; MetaFilePict"流?
(2)如果我通过COM接口IDataObject与剪贴板交互,我应该怎么处理" Embed Source"和" MetaFilePict"?
(3)在C#中有更好的方法来实现OLE(客户端或服务器会帮助我)吗?
更多详情:
我正在寻求在C#中实现OLE服务器(外部Windows API和其他适用于x86的方法对我来说都可以,只要它们可以在一个C#项目中)。我找不到任何不涉及MFC的OLE示例。所以我先尝试了一下。
我的第一步是查看其他OLE服务器为将数据放入剪贴板而执行的操作。我已经尝试了两种与剪贴板交互的方法:NET Clipboard类,它给了我三个Streams,如后面所述,以及OleGetClipboard返回的IDataObject接口,它给了我指针。
我发现Origin放置了三个数据条目:Object Descriptor,Embed Source和MetaFilePict。它们似乎是Stream。如果我从三个Streams读取所有字节,将它们放回新的DataObject并再次将DataObject放到剪贴板中,我可以将原始对象粘贴到例如Word中,这意味着三个Streams的内容足够用于粘贴OLE容器。
我进一步发现,Object Descriptor包含带有数据类guid和一些名称的OBJECTDESCRIPTOR结构,我能够实例化该对象并将其转换为IOLEObject。但我不知道其他两个流,Embed Source和MetaFilePict应该是什么。根据我的理解,Embed Source应该包含在创建它之后传递给IOLEObject的数据(可能是由InitFromData),但是我没有成功。并且重新编写MetaFilePict,似乎没有这个条目,其他两个无法正常工作(如果只存在Object Descriptor和Embed Source,则粘贴在Word中最终没有任何内容)。但同样,我不知道其中的内容。它似乎以ASCII字符串开头(在我的例子中是" CPYA 4.2878 724#")并且看起来不像WMF文件。
如果我使用COM对象IDataObject(在System.Runtime.InteropServices.ComTypes或Microsoft.VisualStudio.OLE.Interop命名空间中),我可以从中获取HMETAFILEPICT,但我不知道如何使用句柄。 PlayMetaFile不起作用。
修改
在MFC中,该示例使用OleCreateFromData直接从剪贴板获取的IDataObject创建对象。这应该也适用于C#。但这只是客户端的实现。我将尝试找出如何实现服务器。