Delphi 如何识别Ole对象接口?

Delphi 如何识别Ole对象接口?,delphi,winapi,com,ole-automation,Delphi,Winapi,Com,Ole Automation,要解释我的确切情况有点困难,但我会尝试: 我正在检查一个通过后期绑定创建的DOM接口,并在某个时候选择一个返回接口OleVariant元素的范围(我肯定知道) 我期望的是IHTMLElement2,但事实并非如此(我得到一个例外,该对象没有标记名属性)。这使我后来怀疑(尚未测试)它是一个节点元素(具有nodeName属性)-但我不想猜测并询问: 如果支持(IDispatch(v),IWhatEver1)。。。否则,如果支持(IDispatch(v),IWhatEver2). 我不知道它支持哪个接

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

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

我期望的是
IHTMLElement2
,但事实并非如此(我得到一个例外,该对象没有
标记名
属性)。这使我后来怀疑(尚未测试)它是一个节点元素(具有
nodeName
属性)-但我不想猜测并询问:

如果支持(IDispatch(v),IWhatEver1)。。。否则,如果支持(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\u BROWSER\u EMULATION=8000
时改变了它的行为->在设计模式下使用TWebBrowser并选择一个范围
vElement
(所选范围中的元素)时,返回为
JScript类型信息
。。。我不知道为什么,我仍然不知道如何处理这个b.s,但至少我知道我有哪个接口

下面是我用来检查元素的代码:

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;
如果SysUtils.Supports(IUnknown(vElement)、IDispatch、LDispatch)则
开始
调试(“Velment支持IDispatch”);
如果LDispatch.GetTypeInfo(0,0,ti)=S_OK,那么
如果ti.GetDocumentation(MEMBERID_NIL,@pbstrName,@pbstrDocString,NIL,NIL)=S_确定

调试(pbstrName+';'+pbstrDocString);// COM接口不提供任何通用方法来检索其
CLSID
ProgID
。你应该知道你在处理什么样的对象。COM对象的文档应该告诉您这些信息

如果出于任何原因,您有一个您不知道其类型的
IDispatch
,您可以通过使用
IDispatch.GetTypeInfo
进行检查来确定它。拥有
ITypeInfo
引用后,调用
ITypeInfo.GetDocumentation
passing
MEMBERID\u NIL
以查找有关对象类的信息


至于你问题第二部分的例子,你同样需要知道你拥有什么类型的物体。您在调用
CreateOleObject
时就知道了这些信息,只是希望您记住。

我真的不明白。在最后一个示例中,您将一个iwinhtprequest分配给v。嗯,v永远是我的追求。它永远不能改变类型。如果您调用一个方法,但不知道它返回什么类型的对象,我建议您阅读文档以了解它。@DavidHeffernan:“阅读文档”。但文件往往不够充分。例如,最著名的PDF产品的文档和TLB中充斥着带有返回IDispatch接口的成员函数的接口,您必须从中检索TLB中的另一种类型的接口才能使用它。我可以想象OP的问题是类似的:“我怎么知道这个不透明的IDispatch背后是什么?”如果你明白我的意思…@MartynA可能是这样的。有时文档很好,程序员没有正确阅读。出问题的方式很多。问题的最后一部分确实表明,询问者可能会有一些困惑。您为持有的接口指针获取ProgID的选项:以及@romar,OK。一旦我拥有了
ProvideClassInfo
ITypeInfo
,我如何获得CLSID?(
ProvideClassInfo2
GetGUID
ProvideClassInfo
没有)在我的情况下(当
v:=SomeObject
时),
v
不知道接口是谁和如何创建的。记住对象是什么是你的工作