delphi – 如何识别Ole对象接口?
解释我的确切情况有点困难,但我会尝试:
我正在检查通过后期绑定创建的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时的信息,您只需要记住. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |