【问题标题】:How to identify Ole object Interface?如何识别Ole对象接口?
【发布时间】:2014-01-14 21:42:38
【问题描述】:

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

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

我以后如何知道 v 后面是哪个 IDispatch?

我希望问题很清楚。


似乎 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;

【问题讨论】:

  • 我不太明白。在您的最后一个示例中,您将 IWinHttpRequest 分配给 v。嗯,v 将始终是 IWinHttpRequest。它永远不能改变类型。如果您调用一个方法并且不知道它返回什么类型的对象,我建议您阅读文档以找出答案。
  • @DavidHeffernan:“阅读文档”。但通常文档不足。例如。最著名的 PDF 产品的文档和 TLB 充斥着带有返回 IDispatch 接口的成员函数的接口,您必须从中检索 TLB 中的另一种类型的接口才能使用它。我可以想象 OP 的问题是相似的:“我怎么知道这个不透明的 IDispatch 背后是什么?”如果你明白我的意思......
  • @MartynA 可能是这样。有时文档很好,而程序员没有正确阅读它。很多事情出错的方法。问题的最后一部分确实表明提问者可能存在一些混淆。
  • @RomanR,好的。拥有ITypeInfoProvideClassInfo 后,如何获取CLSID? (ProvideClassInfo2GetGUIDProvideClassInfo 没有)

标签: delphi winapi com ole-automation


【解决方案1】:

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

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

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

【讨论】:

  • 在我的情况下(v := SomeObject),v 不知道接口是由谁以及如何创建的。
  • 记住对象是什么是你的工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2010-11-13
  • 2010-10-10
  • 2014-05-31
相关资源
最近更新 更多