6

解释我的确切情况有点困难,但我会尝试:

我正在检查一个通过后期绑定创建的 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;
4

1 回答 1

5

COM 接口不提供任何通用方法来检索它们的CLSIDProgID. 你应该知道你正在处理什么样的对象。COM 对象的文档应该告诉您这些信息。

如果出于某种原因,你有一个IDispatch你不知道的类型,你可以通过检查来解决它IDispatch.GetTypeInfo。获得ITypeInfo引用后,调用ITypeInfo.GetDocumentation传递MEMBERID_NIL以查找有关对象类的信息。

至于问题第二部分中的示例,您应该再次知道您拥有什么类型的对象。您在拨打电话时就知道该信息,CreateOleObject并且您只需要记住即可。

于 2013-12-27T10:39:43.857 回答