首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Marshal.QueryInterface?

如何使用Marshal.QueryInterface?
EN

Stack Overflow用户
提问于 2011-02-22 10:54:33
回答 2查看 6.5K关注 0票数 5

我正在尝试处理Word文档中的一些嵌入对象。早些时候的一张海报告诉我,这是不直接的。以下是链接答案的摘录:

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

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

代码语言:javascript
复制
// 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;
                    }
                }
            }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 11:10:41

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-02-22 11:08:53

我不知道你打算做什么,但可以打电话给QueryInterface。唯一的问题是这里有一个ProgID,需要首先从它获取CLSID。您可以通过pInvoking CLSIDFromProgId函数来完成。

代码语言:javascript
复制
[DllImport("ole32.dll")]
static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);

然后,您可以这样称呼它:

代码语言:javascript
复制
Marshal.QueryInterface(IntPtr.Zero, CLSIDFromProgID(progID), out pInterface);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5077172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档