我如何使用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;
但是我不清楚代码中的哪个对象实现了IPersistStorage
, IPersistStreamInit
等。
我不确定你打算做什么,但可以调用QueryInterface
。 唯一的问题是你在这里有一个ProgID
,你需要先从它获取CLSID
。 您可以通过pInvoking CLSIDFromProgId函数来完成。
[DllImport("ole32.dll")] static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);
然后,您可以按如下方式调用:
上述就是C#学习教程:我如何使用Marshal.QueryInterface?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Marshal.QueryInterface(IntPtr.Zero, CLSIDFromProgID(progID), out pInterface);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1025404.html