解释我的确切情况有点困难,但我会尝试:
我正在检查一个通过后期绑定创建的 DOM 接口,并在某些时候选择一个返回接口 OleVariant 元素的范围(我肯定知道)。
我期待一个,IHTMLElement2
但事实并非如此(我得到一个异常,该对象没有tagName
属性)。这让我后来怀疑(尚未测试)它是一个 Node 元素(它具有nodeName
属性) - 但我不想猜测,并问:
if Supports(IDispatch(v), IWhatEver1)... else if Supports(IDispatch(v), IWhatEver2)...
我不知道它支持哪个接口。我如何知道 OleVariant 接口对象的接口名称/guid?
该问题不仅特定于 DOM,例如,如果我有一个通过以下方式创建的 OleVariant:
SomeObject := CreateOleObject('WinHttp.WinHttpRequest.5.1');
or
SomeObject := CreateOleObject('Msxml.ServerXMLHTTP');
or
SomeObject := CreateOleObject('Msxml.XMLHTTP');
etc...
v := SomeObject;
我以后怎么知道哪个 IDispatch 在后面v
?
我希望这个问题很清楚。
似乎 IE11 在FEATURE_BROWSER_EMULATION = 8000
用于我的应用程序时改变了它的行为 - >当您在设计模式下使用 TWebBrowser 并选择一个范围vElement
(所选范围中的元素)返回为JScriptTypeInfo
......我不知道为什么,我也不知道仍然如何处理这个bs,但至少我知道我有哪个接口!
这是我用来检查元素的代码:
if SysUtils.Supports(IUnknown(vElement), IDispatch, LDispatch) then
begin
debug('vElement Supports IDispatch');
if LDispatch.GetTypeInfo(0, 0, ti) = S_OK then
if ti.GetDocumentation(MEMBERID_NIL, @pbstrName, @pbstrDocString, nil, nil) = S_OK then
debug(pbstrName + ';' + pbstrDocString); // <- JScriptTypeInfo;JScript TypeInfo
end;