当前位置: 首页 > 编程语言 > C#

如何使用Marshal.QueryInterface?分享

时间:2023-04-10 20:00:11 C#

我如何使用Marshal.QueryInterface?我正在尝试在Word文档中使用一些嵌入式对象。较早的海报告诉我这并不简单。这是相关回答的摘录:“正如我之前提到的,利用嵌入式对象的编程模型来执行保存是一种捷径。有一个更复杂的解决方案可以与任何嵌入式对象一起使用。为了要在其中嵌入对象,首先,它必须支持COMIPersist接口之一(即IPersistStorage、IPersistStreamInit、IPersistFile等)。因此,可以通过调用OLEFormat.Object上的Marshal.QueryInterface来提取嵌入的对象(以确定适当的持久性)interface),对应然后调用相应的方法。根据你使用的持久化接口,你可能需要调用一些其他的方法来在文件顶部暴露相应的存储。另外,根据嵌入的类型对象,你可能仍然需要在持久化接口的QueryInterface之前激活该对象。”所以我有兴趣公开对象正在实现的接口。我能找到的最接近的是这里。到目前为止的代码如下,非常感谢对Marshal.QueryInterface的任何帮助。//打开word文档对象missing=Type.Missing;this.document=wordApp.Documents.Open(reffn,refconfirmConversions,refreadOnly,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,ref缺失,参考缺失,参考缺失);foreach(Microsoft.Office.Interop.Word.InlineShapeinlineShapeinthis.document.InlineShapes){if(inlineShape.OLEFormat.ProgID!=null){switch(inlineShape.OLEFormat.ProgID){//这是一个pdf文件case"AcroExch.Document.7"://Marshal.QueryInterface(IntPtrpUnk,refGuidiid,outIntPtrppv);休息;默认值:中断;}}}Marshal.QueryInterface不是必需的-如果您使用COM对象并将其转换为COM接口类型,.NET将为您执行QueryInterface调用。也就是说,您可以这样写:IPersistStoragepersist=(IPersistStorage)obj;但是我不清楚代码中的哪个对象实现了IPersistStorage、IPersistStreamInit等。我不确定你打算做什么,但是调用QueryInterface。唯一的问题是您在这里有一个ProgID,您需要先从中获取CLSID。您可以通过调用CLSIDFromProgId函数来完成。[DllImport("ole32.dll")]staticexternintCLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)]stringlpszProgID,outGuidpclsid);那么,你可以这样调用:以上是C#学习教程:如何使用Marshal.QueryInterface?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——Marshal.QueryInterface(IntPtr.Zero,CLSIDFromProgID(progID),outpInterface);本文收集自网络,不代表任何内容,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: