基本上,按照以下版本控制规则,IHTMLElement5和IHTMLElement6都是主IHTMLElement的扩展接口:
IHTMLElement IE4
IHTMLElement2 IE5
IHTMLElement3 IE5.5
IHTMLElement4 IE6
IHTMLElement5 IE8
IHTMLElement6 IE9
当然,每个新的扩展接口中都具有旧成员+自己的新成员,属性等。但是,某些成员(例如.getAttribute)具有相同的名称,但是已经过更新。所以,我的问题是,如果我使用(例如)IHTMLElement6声明我的HTML元素并在仅安装了IE6的客户端上运行代码,那么我的对象何时会失败并在设置它时保留为Null / Nothing,或者mshtml.dll足够聪明,可以了解发生了什么,并且默认为IHTMLElement4(实际上是IHTMLElement)行为?
为了澄清括号中的最后一条语句,在IHTMLElement中添加了.getAttribute,并在IHTMLElement5和IHTMLElement6中对其进行了更新-因此,如果某人仅安装了IE6,则我希望该行为默认/恢复为IHTMLElement(而不是IHTMLElement4)-并且如果不这样做,那么我希望我的代码崩溃。基本上,我的问题是,究竟会发生什么?
现在,因为我害怕得要疯,所以我只是将所有内容都声明为IHTMLElement,有什么想法吗?
谢谢。
问题摘要(如果发现必要,请阅读,只是对需要者的澄清):
基本上,我希望能够将某些内容声明为IHTMLElement6,以便可以使用在IHTMLElement和IHTMLElement6之间具有相同名称的更新方法(例如.getAttribute)。这样,在IE9用户上,将利用IHTMLElement6的.getAttribute版本,而与此同时,在不破坏我的代码的情况下,IHTMLElement的.getAttribute版本仍可用于(例如)IE6用户,这就是我的问题所在,当使用IHTMLElement6对象时,即使它是IE9接口,IHTMLElement的.getAttribute版本(IE4接口)也会启动/起作用,还是会出现空引用异常或其他运行时错误?谢谢大家
回答越多,即使是您的意见,而您不知道是事实,也越好,我想鼓励您在发表评论的同时让我们知道您是否知道这是事实还是仅仅是意见/猜等等。谢谢。
最佳答案
我怀疑在不支持IHTMLElement6
的旧版IE中,将DOM元素强制转换为IHTMLElement6
会因InvalidCastException
而失败。您将没有机会致电IHTMLElement6.getAttribute()
,因为首先您将无法获得有效的IHTMLElement6
引用。
如果这是正确的,那么您已经在执行的操作(使用IHTMLElement
)似乎是正确的操作过程。
更新:我的怀疑是正确的。我写了一个WinForms应用,该应用引用了IE9附带的mshtml.dll版本。在具有IE9的系统上,该应用程序成功将<img>
元素强制转换为IHTMLElement6
。但是在具有IE8的系统上,相同的强制转换失败:
System.InvalidCastException:无法将类型为“ mshtml.HTMLImgClass”的COM对象转换为接口类型为“ mshtml.IHTMLElement6”。此操作失败,因为具有以下错误的IID为'{305106F8-98B5-11CF-BB82-00AA00BDCE0B}'的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) 。