如何获取ihtmlelement指针指向标签托管ActiveX控件

StackOverflow https://stackoverflow.com/questions/4103315

我有一个由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;
            ...
        }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top