加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何识别Ole对象接口?

发布时间:2020-12-15 04:13:56 所属栏目:大数据 来源:网络整理
导读:解释我的确切情况有点困难,但我会尝试: 我正在检查通过后期绑定创建的DOM接口,并在某个时候选择一个返回接口OleVariant元素的范围(我知道这肯定). 我期待一个IHTMLElement2但它不是(我得到一个例外,该对象没有tagName属性).这让我后来怀疑(尚未测试)它的Nod
解释我的确切情况有点困难,但我会尝试:

我正在检查通过后期绑定创建的DOM接口,并在某个时候选择一个返回接口OleVariant元素的范围(我知道这肯定).

我期待一个IHTMLElement2但它不是(我得到一个例外,该对象没有tagName属性).这让我后来怀疑(尚未测试)它的Node元素(具有nodeName属性) – 但我不想猜,并问:

if Supports(IDispatch(v),IWhatEver1)… else if supportsorts(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,ti) = S_OK then
      if ti.GetDocumentation(MEMBERID_NIL,@pbstrName,@pbstrDocString,nil,nil) = S_OK then
        debug(pbstrName + ';' + pbstrDocString); // <- JScriptTypeInfo;JScript TypeInfo
  end;

解决方法

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

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

至于问题第二部分中的示例,您需要知道您拥有的对象类型.您知道在调用CreateOleObject时的信息,您只需要记住.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读