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)
COM接口不提供任何通用方法来检索其CLSID
or ProgID
。您应该知道您正在处理哪种对象。COM对象的文档应该告诉您该信息。
如果出于某种原因,您IDispatch
不知道其类型,则可以使用进行检查IDispatch.GetTypeInfo
。获得ITypeInfo
引用后,调用ITypeInfo.GetDocumentation
pass MEMBERID_NIL
来查找有关对象类的信息。
至于问题第二部分中的示例,您又应该知道您拥有哪种类型的对象。您知道在致电时知道的信息,CreateOleObject
只是希望您记住这些信息。