我有一个自定义ActiveX控件,由IE中的网页使用 . 它加载得很好,如果我通过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 回答
我找不到支持链接,但IE(至少旧版本如6和7)不会让您从使用新ActiveXObject()创建的控件中触发事件 . 可能存在其他差异......在IE内部,代码路径非常不同 . 我不知道完整的指南 .
您可以在SetSite()方法中设置断点,看看它是否被调用 . 同时验证您的注册是否正确 .
在对象标签或使用ActiveXObject创建的对象中创建的对象的启动是不同的 - 当您考虑它时,它们必须是,因为没有可以绘制的窗口 . 因为hinted here对象标签实例化控件作为IObjectWithSite(由mshtml.dll提供),而新的ActiveXObject将其实例化为IOleObject(由jscript.dll提供) .
这意味着使用ActiveXObject,SetSite is called并使用对象标签SetClientSite is called . 此外,您不会获得任何IPersistPropertyBag调用,也不会使用ActiveXObject调用任何InPlaceActivate等调用 .
当然可以编写一个控件来支持两者,从我链接的FireBreath源代码可以看出 .
一个更完整的解释(来自更了解它的人)can be found here .
感谢那些提交以前答案的人 . 虽然他们没有为我的问题提供解决方案,但他们让我走上正确的轨道,自己找到答案 .
问题是我的ActiveX控件使用了Microsoft的SiteLock模板(IObjectSafetySiteLockImpl)提供的IObjectSafety的实现 . 正如SiteLock文档所述:
在这种情况下,我的ActiveX控件不需要SiteLock功能,因此我将IObjectSafetySiteLockImpl替换为IObjectSafey(IObjectSafetyImpl)的标准ATL实现 .