gpt4 book ai didi

c++ - 如何获取指向托管 activex 控件的 标记的 IHTMLElement 指针
转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:22 26 4
gpt4 key购买 nike

我有一个由 FireBreath 框架 (http://firebreath.org) 生成的 ActiveX 控件。我需要在托管 C++ 插件的页面中获取对 标记的引用。

如果我使用 NPAPI,我会使用 NPNVPluginElementNPObject 常量和 NPN_GetValue。

为了确保我表达清楚,假设我在页面中有以下内容:

我想获得对插件的引用,就像我使用 document.getElementById("testPlugin") 时一样,除了从为该 mimetype 插入的 activex 控件的 C++ 代码中。

请注意,将 id 作为 传递对我来说不是一个好的选择,但如果有一种方法可以从 activex 控件内部获取 ID 可能会起作用。

编辑:我正在考虑使用 getElementsByTagName 并尝试通过 DOM 找到它,但是很难区分同一插件的两个实例。

最佳答案

感谢来自芬兰的 FireBreath 贡献者 jtojanen,我们终于找到了解决方案。

首先,COM 对象必须 注册为“Apartment”,而不是“Single”(在注册表中)。否则,这是行不通的;似乎是 COM 中的错误。

然后在调用 SetClientSite 之后的任何地方,您可以执行以下操作:

CComQIPtr<IOleControlSite> site(m_spClientSite);
CComPtr<IDispatch> dispatch;
site->GetExtendedControl(&dispatch);
CComQIPtr<IHTMLElement2> htmlElement = dispatch;

希望这可以节省一些时间;我花了将近 2 年的时间才找到可以为我回答这个问题的人。

htmlElement 中的对象将是包装插件的 标签;因此,如果您为任何接口(interface)查询接口(interface),它应该会成功,但它实际上可能不是您的对象,它可能是您对象的包装器。

关于c++ - 如何获取指向托管 activex 控件的 <object> 标记的 IHTMLElement 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4103315/

26 4 0