如何获取ihtmlelement指针指向
-
29-09-2019 - |
题
我有一个由Firebreath Framework(http://firebreath.org)生成的ActiveX控件。我需要参考u003Cobject>在托管C ++插件的页面中标记。
如果我使用的是NPAPI,则将使用npn_getValue使用NPNVPluginelementNPObject常数。
因此,为确保我很清楚,说我在页面中有以下内容:
u003Cobject id="testPlugin" type="application/x-someplugin" width="100%" height="100%">u003C/object>
我想像使用document.getElementById(“ testplugin”)那样获得对插件的引用,除非来自ActiveX控件的C ++代码,该代码插入了该模拟器类型。
请注意,将ID传递给u003Cparam>对我来说不是一个不错的选择,但是如果有一种方法可以从ActiveX控件内部获取ID,则可能起作用。
编辑: 我正在考虑使用getElementsBytaGname并尝试通过DOM找到它,但是很难分辨出同一插件的两个实例之间的差异。
解决方案
多亏了来自芬兰的Firebreath贡献者Jtojanen,我们终于有了解决方案。
第一件事是com对象 必须 被注册为“公寓”,而不是“单一”(在注册表中)。否则,这将不起作用;似乎是com中的错误。
然后,在调用setClientsETITE之后的任何地方,您都可以执行以下操作:
CComQIPtr<IOleControlSite> site(m_spClientSite);
CComPtr<IDispatch> dispatch;
site->GetExtendedControl(&dispatch);
CComQIPtr<IHTMLElement2> htmlElement = dispatch;
希望这能节省某些时间;我花了将近两年的时间才找到一个可以为我回答的人。
htmlelement中的对象将是u003Cobject>标记包装您的插件;因此,如果您查询任何接口,它应该成功,但实际上可能不是您的对象,它可能是对象的包装器。
其他提示
在C#:
public int SetSite(object site)
{
if (site != null)
{
var oleControl = (IOleControlSite)site;
object oHtmlElement;
oleControl.GetExtendedControl(out oHtmlElement);
var htmlElement = (IHTMLElement2)oHtmlElement;
...
}
}