我们有一些动态HTML页面,其中包含一个实例化ActiveX控件的<OBJECT>
标记。然后,用户可以导航到另一页面,该页面包含指向较新版本的ActiveX控件的<OBJECT>
标签。
IE将在第二页上下载并安装新的ActiveX,这就是那个页面的用途。问题是,由于IE在第一页上加载了ActiveX,它现在会强制用户在完全安装下载的ActiveX之前重新启动,因为它正由进程(IE)使用。
在普通容器中,我只是在尝试升级之前卸载ActiveX。有没有办法迫使IE这样做?如果可以做到这一点,那么浏览一个不使用控件的页面是可以接受的。
修改
要求ActiveX本身执行某些操作的解决方案不会起作用,因为问题是当IE开始安装新版本的ActiveX时,ActiveX仍在内存中。我想要做的是在IE启动该过程时不要在内存中使用ActiveX,所以显然我不能依赖ActiveX控件本身的任何东西。
答案 0 :(得分:7)
尝试使用javascript delete语句:
function unloadObject(objId) {
var obj = document.getElementById(objId);
obj.parentNode.removeChild(obj);
delete obj;
}
在打开第二页之前致电unloadObject(targetActiveXTagId)
。
理想情况下,您应该在ActiveX本身中构建升级机制。我见过几个在线游戏平台做得很好,效果很好。
答案 1 :(得分:2)
虽然我不知道如何让IE卸载DLL(它保持DLL文件句柄打开 - 我希望它能正确释放对象......)我使用的一个解决方案是复制DLL打开它之前的临时文件(基于程序集版本),然后明确地打破IE / COM /任何缓存。因此,即使旧的DLL文件句柄保持打开,我也可以加载“新”版本。
我只能在满足所有的时候打破缓存:
我正在为侧边栏小工具开发,所以我可以使用一些特权的ActiveX脚本友好组件来完成上述操作,但预加载器(未更新)的ActiveX组件也可以完成这项工作。
我依靠.NET / mscoree.dll来处理COM的东西,所以可能会有更简洁的方法进入较低级别。
使用临时加载处理不同的“版本控制”到HKCU \ Software \ Classes结构中。
答案 2 :(得分:1)
我认为这是不可能的。
答案 3 :(得分:0)
您可以尝试的一件事是让安装程序调用{{3}},然后在ActiveX控件的CoFreeUnusedLibraries()中使用S_OK进行响应。这可能会让你卸载,但我想知道IE是否仍然可以尝试回调你的卸载模块。很容易尝试。
您还可以编写一个存根DLL,它实现了您触摸IE的所有接口,然后只是实际执行该功能的真实 DLL。然后,您可以让安装程序广播一条消息,说明“卸载真正的DLL”。然后在完成后广播另一条消息并加载新消息。当更新发生时,您的存根会显示“请等待我更新...”消息。
答案 4 :(得分:0)
您是否尝试过使用Javascript来杀死ActiveX控件所在的DOM元素?如果你这样做,IE将告诉控件卸载,但你必须确保控件WILL实际上卸载。然后,您应该能够使用较新的对象引用命中页面,这将引发较新的对象....
如果不这样做,您可以尝试打开一个弹出窗口,指示您从不加载对象的页面,同时使用对主浏览器的命名引用,将其重定向到不引用您的对象的页面对象,让它有机会卸载,然后重新引用更新的ActiveX。这应该加载你的新控件。
无论你走哪条路,这都是一个棘手的问题,但你可以让它做你想做的事。
如果您的控件行为不正确,可能无法正常卸载,因此您必须注意这一点。
拉里
答案 5 :(得分:0)
你不能改变工作流程吗?首先检查更新,避免整个问题!
无论您实施什么解决方案,浏览器都由客户端控制,任何(安全)更新或新版本都可能破坏您的系统。
答案 6 :(得分:-1)
愚蠢的回答,对不起。我猜测如果你仍然打开这个问题,重定向就不起作用了。如果您没有尝试过,只需创建一个重定向到更新的ActiveX页面并在那里链接的页面。
middleman.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>blank page</title>
<meta http-equiv="REFRESH" content="0;url=http://www.newactivexcontrol.com"></HEAD>
<BODY>
</BODY>
</HTML>
答案 7 :(得分:-1)
显然是,不。
它可能会发生,但前提是您通过安全漏洞“破解”它。所以不是通过任何合法的过程,不是。
这是一篇描述漏洞状态的文章: http://www.juniper.net/security/auto/vulnerabilities/vuln16409.html
这是一篇关于Technet讨论DWORD ActiveX如何杀死进程的文章 http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q240797&sd=tech
这是来自MSDN网站的关于ActiveX控件的引用:
“用户无法直接与APPLET,EMBED或OBJECT元素加载的Microsoft ActiveX控件进行交互。用户可以在激活用户界面后与这些控件进行交互。” http://msdn.microsoft.com/en-us/library/ms537508.aspx