ActiveX加载方法的差异

时间:2011-08-04 23:11:15

标签: internet-explorer activex

我有一个IE浏览器网页使用的自定义ActiveX控件。它加载很好,如果我通过这样的OBJECT标签加载它,可以访问页面中运行的Javascript:

<object id="ccl" codeBase="ccl.cab" classid="CLSID:12372D58-F10C-11CF-B7A9-0020AFD6A362" NOEXTERNALDATA="true"></object>

但是如果我尝试通过这样的新ActiveXObject()加载它:

var x = new ActiveXObject('myObj.abc');

我收到错误“自动化服务器无法创建对象”。

我认为这两种加载文档的方法在已经安装了ActiveX控件的情况下是等效的。但显然他们不是。任何人都可以帮助我理解OBJECT标记方法在新的ActiveXObject方法失败时会在什么条件下成功?我已经仔细检查以确保我传入新ActiveXObject()的progID是正确的,并且应该在HKEY_CLASSES_ROOT \ CLSID下的注册表中显示。提前感谢任何想法。

3 个答案:

答案 0 :(得分:0)

我找不到支持链接,但IE(至少旧版本如6和7)不允许从使用新ActiveXObject()创建的控件中触发事件。可能存在其他差异......在IE内部,代码路径非常不同。我不知道完整的指南。

您可以在SetSite()方法中设置断点,看看它是否被调用。同时验证您的注册是否正确。

答案 1 :(得分:0)

在对象标记或使用ActiveXObject创建的对象中创建的对象的启动是不同的 - 当您考虑它时,它们必须是,因为没有可以绘制的窗口。原样{{对象标记将控件实例化为IObjectWithSite(通过mshtml.dll),而新的ActiveXObject将其实例化为IOleObject(通过jscript.dll)。

这意味着使用ActiveXObject hinted here并使用对象标记SetSite is called。此外,您不会获得任何IPersistPropertyBag调用,也不会使用ActiveXObject调用任何InPlaceActivate等调用。

当然可以编写一个控件来支持两者,从我链接的FireBreath源代码可以看出。

更完整的解释(来自更了解它的人)SetClientSite is called

答案 2 :(得分:0)

感谢那些提交了以前答案的人。虽然他们没有为我的问题提供解决方案,但他们让我走上正确的轨道,自己找到答案。

问题是我的ActiveX控件使用了Microsoft的SiteLock模板(IObjectSafetySiteLockImpl)提供的IObjectSafety实现。正如SiteLock文档所述:

  

如果您通过脚本创建ActiveX控件(而不是使用标记),那么   脚本主机负责设置站点而不是浏览器。既不是JavaScript也不是&gt; VBScript引擎将设置该站点,直到它确定您是安全的,所以你不能   以这种方式创建一个站点锁定的控件。

在这种情况下,我的ActiveX控件不需要SiteLock功能,因此我将IObjectSafetySiteLockImpl替换为IObjectSafey(IObjectSafetyImpl)的标准ATL实现。