我正在尝试处理Word文档中的一些嵌入对象。早些时候的一张海报告诉我,这是不直接的。以下是链接答案的摘录:
“正如我前面提到的,使用嵌入式对象的编程模型来执行保存是一种捷径。有一个更复杂的解决方案,它将与任何嵌入式对象一起工作。为了首先嵌入对象,它必须支持COM IPersist接口之一(即IPersistStorage、IPersistStreamInit、IPersistFile等)。因此,始终可以通过在Marshal.QueryInterface上调用OLEFormat.Object (以确定合适的持久接口)来提取嵌入对象,并相应地进行转换,然后调用适当的方法。根据您使用的持久性接口,您可能需要调用一些额外的方法来在文件顶部公开适当的存储。此外,根据嵌入对象的类型,您可能还需要激活对象,然后才能成功地为持久接口进行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;
}
}
}发布于 2011-02-22 11:10:41
Marshal.QueryInterface不应该是必需的--如果您将COM对象转换为COM接口类型,则.NET会为您执行QueryInterface调用。也就是说,你可以写:IPersistStorage persist = (IPersistStorage) obj;
但是,我不清楚代码中的哪个对象实现了IPersistStorage、IPersistStreamInit等。
发布于 2011-02-22 11:08:53
我不知道你打算做什么,但可以打电话给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);https://stackoverflow.com/questions/5077172
复制相似问题