首页 文章

ActiveX加载方法的差异

提问于
浏览
0

我有一个自定义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 回答

  • 0

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

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

  • 0

    在对象标签或使用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 .

  • 0

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

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

    如果通过脚本创建ActiveX控件(而不是使用标记),则脚本主机负责设置站点而不是浏览器 . 在确定您是安全的之前,JavaScript和> VBScript引擎都不会设置该站点,因此您无法以这种方式创建站点锁定控件 .

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

相关问题