如何获取指向托管activex控件</object>的<object>标记的IHTMLElement指针

时间:2010-11-05 03:09:22

标签: c++ internet-explorer activex idispatch activexobject

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

如果我使用NPAPI,我会将NPNVPluginElementNPObject常量与NPN_GetValue一起使用。

所以为了确保我清楚,请说我在页面中有以下内容:

&lt; object id =“testPlugin”type =“application / x-someplugin”width =“100%”height =“100%”&gt;&lt; / object&gt;

我希望获得对插件的引用,就像我使用document.getElementById(“testPlugin”)一样,除了在为该mimetype插入的activex控件的C ++代码中。

请注意,将id作为&lt; param&gt;传递给对我来说不是一个好选择,但如果有办法从activex控件中获取可能有效的ID。

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

2 个答案:

答案 0 :(得分:2)

感谢来自芬兰的FireBreath撰稿人jtojanen,我们终于找到了解决方案。

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

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

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

希望这能节省一些时间;我差不多花了两年时间才找到能够为我解答的人。

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

答案 1 :(得分:0)

在C#中:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }