解释我的确切情况有点困难,但我会尝试:
我正在检查通过后期绑定创建的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;
我如何知道v
后面的哪个IDispatch?
我希望问题很明确。
似乎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;
答案 0 :(得分:5)
COM接口不提供任何通用方法来检索其CLSID
或ProgID
。你应该知道你正在处理什么样的对象。 COM对象的文档应该告诉您该信息。
如果由于某种原因,您有IDispatch
您不知道的类型,您可以使用IDispatch.GetTypeInfo
进行检查。获得ITypeInfo
引用后,请致电ITypeInfo.GetDocumentation
传递MEMBERID_NIL
以查找有关该对象类的信息。
至于问题第二部分的示例,您需要知道您拥有的对象类型。您知道在您致电CreateOleObject
时的信息,您只需要记住。