我如何使用Marshal.QueryInterface?

我正在尝试使用Word文档中的一些嵌入对象。 早先的一张海报告诉我,这不是直截了当的。 以下是相关答案的摘录:

“正如我前面提到的,利用嵌入式对象的编程模型来执行保存是一种捷径。有一个更复杂的解决方案可以用于任何嵌入式对象。为了将对象嵌入到第一位,它必须支持其中一个COM IPersist接口(即IPersistStorage,IPersistStreamInit,IPersistFile等)。因此,可以通过调用OLEFormat.Object上的Marshal.QueryInterface(以确定适当的持久性接口)来提取嵌入对象,相应地进行转换,然后调用适当的方法。根据您使用的持久性接口,您可能需要调用一些其他方法来在文件顶部公开相应的存储。此外,根据嵌入对象的类型,您可能仍需要激活能够成功查询持久性接口的QueryInterface之前的对象。“

所以我有兴趣公开对象正在实现的接口。 我能找到的最接近的是这里 。 到目前为止的代码如下,非常感谢Marshal.QueryInterface的任何帮助。

// Opening the word document object missing = Type.Missing; this.document = wordApp.Documents.Open( ref fn, ref confirmConversions, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); foreach (Microsoft.Office.Interop.Word.InlineShape inlineShape in this.document.InlineShapes) { if (inlineShape.OLEFormat.ProgID != null) { switch (inlineShape.OLEFormat.ProgID) { // This is a pdf file case "AcroExch.Document.7": //Marshal.QueryInterface(IntPtr pUnk, ref Guid iid, out IntPtr ppv); break; default: break; } } } 

Marshal.QueryInterface不是必需的 – 如果您使用COM对象并将其转换为COM接口类型,.NET将为您执行QueryInterface调用。 也就是说,你可以写: IPersistStorage persist = (IPersistStorage) obj;

但是我不清楚代码中的哪个对象实现了IPersistStorageIPersistStreamInit等。

我不确定你打算做什么,但可以调用QueryInterface 。 唯一的问题是你在这里有一个ProgID ,你需要先从它获取CLSID 。 您可以通过pInvoking CLSIDFromProgId函数来完成。

 [DllImport("ole32.dll")] static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid); 

然后,您可以按如下方式调用:

 Marshal.QueryInterface(IntPtr.Zero, CLSIDFromProgID(progID), out pInterface);