c – 如何获取指向托管activex控件的标记的IHTMLElement指针

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

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

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

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

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

请注意,将id作为< param>传递给对我来说不是一个好选择,但如果有办法从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;

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

htmlElement中的对象将是< object>包装你的插件的标签;因此,如果您对任何接口使用queryInterface,它应该会成功,但实际上它可能不是您的对象,它可能是您对象的包装器.

点赞