gpt4 book ai didi

delphi - 如何识别Ole对象接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 15:00:55 24 4
gpt4 key购买 nike

解释我的确切场景有点困难,但我会尝试:

我正在检查通过后期绑定(bind)创建的 DOM 接口(interface),并在某个时候选择一个返回接口(interface) OleVariant 元素的范围(我确信这一点)。

我期待一个 IHTMLElement2 但它不是(我得到一个异常,该对象没有 tagName 属性)。这让我后来怀疑(尚未测试)它是一个 Node 元素(具有 nodeName 属性) - 但我不想猜测,并询问:

如果支持(IDispatch(v),IWhatEver1)...否则如果支持(IDispatch(v),IWhatEver2)...

我不知道它支持哪个接口(interface)。我如何从 OleVariant 接口(interface)对象中知道接口(interface)名称/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 ( selected Range) 返回为 JScriptTypeInfo...我不知道为什么,而且我仍然不知道如何处理这个废话,但至少我知道我有哪个接口(interface)!

这是我用来检查元素的代码:

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;

最佳答案

COM 接口(interface)不提供任何通用方法来检索其 CLSIDProgID。您应该知道您正在处理什么类型的对象。 COM 对象的文档应该告诉您该信息。

如果出于某种原因,您不知道 IDispatch 的类型,则可以使用 IDispatch.GetTypeInfo 通过检查来确定。获得 ITypeInfo 引用后,调用 ITypeInfo.GetDocumentation 并传递 MEMBERID_NIL 来查找有关对象类的信息。

对于问题第二部分的示例,您再次应该知道您拥有什么类型的对象。您在调用 CreateOleObject 时就知道该信息,并且您只需记住即可。

关于delphi - 如何识别Ole对象接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20798304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com