gpt4 book ai didi

c# - .net 文档用 mshtml 写

转载 作者:太空狗 更新时间:2023-10-30 00:16:50 25 4
gpt4 key购买 nike

我正在使用 mshtml 进行 html 解析。 (版本 7.0.3300.0,C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll)。

HTMLDocumentClass 有一个 write 方法,所以我使用了它,但它引发了 ComException错误代码:-2147352571 和消息:类型不匹配。这是什么原因呢?如果不会使用 HTMLDocumentClass 的 write 方法,为什么要定义?

    HTMLDocumentClass getHTMLDocument(string html)
{
HTMLDocumentClass doc = new HTMLDocumentClass();

doc.write(new object[] { html }); // raises exception
doc.close();

return doc;
}

HTMLDocumentClass getHTMLDocument2(string html)
{
HTMLDocumentClass doc = new HTMLDocumentClass();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(new object[] { html });
doc2.close();

return doc;
}

最佳答案

好的,我找到了。这是一个有趣的故障模式。我在机器上安装的所有 Microsoft.mshtml 的 PIA 都已过时。不少于 4 个,所有版本均为 7.0.3300.0,运行时目标为 1.0.3705(相当旧)。

由类型库导入程序生成的 fooClass 互操作类是原因。它是一个合成类,它的存在是为了使事件更容易处理,它们在 COM 中的处理方式非常不同。该类是所有接口(interface)的所有组合方法的扁平化版本。 HTMLDocument coclass 的当前 SDK 版本声明如下(来自 mshmtl.idl):

[
uuid(25336920-03F9-11cf-8FD0-00AA00686F13)
]
coclass HTMLDocument
{
[default] dispinterface DispHTMLDocument;
[source, default] dispinterface HTMLDocumentEvents;
[source] dispinterface HTMLDocumentEvents2;
[source] dispinterface HTMLDocumentEvents3;
interface IHTMLDocument2;
interface IHTMLDocument3;
interface IHTMLDocument4;
interface IHTMLDocument5;
interface IHTMLDocument6;
interface IHTMLDOMNode;
interface IHTMLDOMNode2;
interface IDocumentSelector;
interface IHTMLDOMConstructor;
};

如果您在互操作库上使用对象浏览器,您会发现 HTMLDocumentClass 缺少 IHTMLDocument6、IDocumentSelector 和 IHTMLDOMConstructor 的接口(interface)方法。您正在使用的 write() 方法通过了这些接口(interface)。

这意味着如果您使用 HTMLDocumentClass.write(),您将调用错误的方法。引发异常是因为调用的任何方法都对参数不满意。当然不是。

这当然是一种令人讨厌的故障模式。这是因为 Microsoft 打破了一个非常严格的 COM 要求,更改 COM 接口(interface)或 coclass 需要一个不同的 guid。上述声明中的 [uuid] 属性。然而,这也使得新版本的 Internet Explorer 与使用它的旧代码完全不兼容。困难重重,向后兼容性在微软是非常神圣的。 coclass 中接口(interface)实现的顺序在常规 COM 客户端中通常不是问题。除了在 .NET 中,它破坏了 tlbimp 生成的合成 XxxClass 类型的布局。

我从未见过实际需要合成类但我自己从未使用过它的情况。您始终可以通过在 C# 中强制转换来获取正确的接口(interface)指针,调用 QueryInterface() 并始终返回正确的指针,而不管版本如何。您的选择是正确的解决方法。

关于c# - .net 文档用 mshtml 写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com