代码之家  ›  专栏  ›  技术社区  ›  taxilian

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

  •  4
  • taxilian  · 技术社区  · 14 年前

    我有一个由firebeath框架生成的ActiveX控件(http://firebeath.org)。我需要得到一个引用,引用从C++中承载插件的页面中的对象& Gt;标签。

    如果我使用NPAPI,我将使用npnpnpluginelementnpobject常量和NPN_GetValue。

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

    <object id=“testPlugin”type=“application/x-someplugin”width=“100%”height=“100%”lt;/对象>

    我想得到一个插件的引用,就像我使用文档.GETelEnMyByID(“TestPuthin”)一样,除了在为该MIMETYPE插入的ActiveX控件的C++代码之外。

    请注意,将id作为<param>传入对我来说不是一个好的选择,但是如果有方法从activex控件内部获取id,则该方法可能有效。

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   taxilian    14 年前

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

    首先是COM对象 必须 登记为“公寓”,而不是“单身”(在登记处)。否则,这将不起作用;似乎是COM中的一个错误。

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

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

    htmlElement中的对象将是包装插件的<object>标记,因此如果您为任何接口查询接口,它应该成功,但实际上它可能不是您的对象,它很可能是您的对象的包装器。

        2
  •  0
  •   Softlion    10 年前

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