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