【发布时间】:2014-01-14 21:42:38
【问题描述】:
解释我的确切情况有点困难,但我会尝试:
我正在检查一个通过 后期绑定 创建的 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;
【问题讨论】:
-
我不太明白。在您的最后一个示例中,您将 IWinHttpRequest 分配给 v。嗯,v 将始终是 IWinHttpRequest。它永远不能改变类型。如果您调用一个方法并且不知道它返回什么类型的对象,我建议您阅读文档以找出答案。
-
@DavidHeffernan:“阅读文档”。但通常文档不足。例如。最著名的 PDF 产品的文档和 TLB 充斥着带有返回 IDispatch 接口的成员函数的接口,您必须从中检索 TLB 中的另一种类型的接口才能使用它。我可以想象 OP 的问题是相似的:“我怎么知道这个不透明的 IDispatch 背后是什么?”如果你明白我的意思......
-
@MartynA 可能是这样。有时文档很好,而程序员没有正确阅读它。很多事情出错的方法。问题的最后一部分确实表明提问者可能存在一些混淆。
-
@RomanR,好的。拥有
ITypeInfo或ProvideClassInfo后,如何获取CLSID? (ProvideClassInfo2有GetGUID但ProvideClassInfo没有)
标签: delphi winapi com ole-automation