如何识别Ole对象接口?

kob*_*bik 6 delphi com winapi 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;
Run Code Online (Sandbox Code Playgroud)

我以后如何知道哪个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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

COM接口不提供任何通用方法来检索其CLSIDor ProgID。您应该知道您正在处理哪种对象。COM对象的文档应该告诉您该信息。

如果出于某种原因,您IDispatch不知道其类型,则可以使用进行检查IDispatch.GetTypeInfo。获得ITypeInfo引用后,调用ITypeInfo.GetDocumentationpass MEMBERID_NIL来查找有关对象类的信息。

至于问题第二部分中的示例,您又应该知道您拥有哪种类型的对象。您知道在致电时知道的信息,CreateOleObject只是希望您记住这些信息。