如何识别Ole对象接口?

时间:2013-12-27 09:41:34

标签: delphi winapi com ole-automation

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

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

1 个答案:

答案 0 :(得分:5)

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

如果由于某种原因,您有IDispatch您不知道的类型,您可以使用IDispatch.GetTypeInfo进行检查。获得ITypeInfo引用后,请致电ITypeInfo.GetDocumentation传递MEMBERID_NIL以查找有关该对象类的信息。

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