Internet explorer ActiveX加载方法的差异

Internet explorer ActiveX加载方法的差异,internet-explorer,activex,Internet Explorer,Activex,我有一个自定义ActiveX控件,可供IE中的网页使用。如果我通过如下对象标记加载该控件,则该控件可以正常加载,并可供页面中运行的Javascript访问: <object id="ccl" codeBase="ccl.cab" classid="CLSID:12372D58-F10C-11CF-B7A9-0020AFD6A362" NOEXTERNALDATA="true"></object> var x = new ActiveXObject('myObj.abc'

我有一个自定义ActiveX控件,可供IE中的网页使用。如果我通过如下对象标记加载该控件,则该控件可以正常加载,并可供页面中运行的Javascript访问:

<object id="ccl" codeBase="ccl.cab" classid="CLSID:12372D58-F10C-11CF-B7A9-0020AFD6A362" NOEXTERNALDATA="true"></object>
var x = new ActiveXObject('myObj.abc');
我收到错误“自动化服务器无法创建对象”


我认为这两种加载文档的方法在ActiveX控件已经安装的情况下是等效的。但显然不是。有谁能帮助我理解在什么情况下,对象标记方法会成功,而新的ActiveXObject方法会失败?我已仔细检查,以确保传递到新ActiveXObject()的progID正确无误,并在注册表中的HKEY_CLASSES_ROOT\CLSID下显示。提前感谢您的建议。

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


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

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

这意味着使用ActiveXObject和对象标记。此外,使用ActiveXObject不会得到任何IPersistPropertyBag调用,也不会得到任何InPlaceActivate等调用

当然,可以编写一个控件来支持两者,正如我链接的FireBreath源代码所示


一个更完整的解释(来自更好理解它的人)。

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

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

如果通过脚本(而不是使用标记)创建ActiveX控件,则 脚本主机负责设置站点,而不是浏览器。JavaScript和>VBScript引擎都不会设置站点,直到它确定您是安全的,所以您不能 以这种方式创建站点锁定控件


在本例中,我的ActiveX控件不需要SiteLock功能,因此我用IObjectSafey(IObjectSafetyImpl)的标准ATL实现替换了IObjectSafetySiteLockImpl。

感谢您的回复。我没有意识到这两个案例如此不同,但正如你所指出的,它们必须如此。不幸的是,我仍然不明白为什么IE在ActiveXObject案例中对我的控件抛出这个错误。我已经验证了我的控件正在加载,并且调用了IOleObject::GetClientSite。然后显示错误。设置更多断点;找出它进入的位置,找出异常抛出的位置(或发生的任何事情)。尝试将其设置为在所有异常情况下中断。我们中的任何人都无法告诉你问题是什么,因为可能有很多事情。