描述:
应用系统: 三层WEB应用
客户端: win2k AS sp4 + IE6 SP1
应用服务器: TurboLinux + Tomcat5
控件开发语言: VC6
页面语言: js + HTML
在开发过程中,发现了一个奇怪的bug:
客户端删除有关注册的控件后,打开IE,访问Web服务器的login页面,下载ActiveX控件成功,首次登录成功,login页面关闭时,IE崩溃,提示是shdocvw.dll模块导致IE出错。
这个问题奇怪之处在于:
1、在绝大多数机器上并不能复现这个问题,目前所知的只有两台PC会出现问题。
2、IE只是在第一次打开login页面,并成功下载控件后进行登录操作才会崩溃。以后再打开IE进行类似操作,不会出问题。
由于其他的客户端访问同一个Web服务器并不出现崩溃的情况,首先考虑的就是客户端IE和shdocvw.dll的问题。经检查,这两台PC的IE均为IE6 SP1,shdocvw.dll的版本分别为6.0.2800.1612和6.0.2800.1692。但是这两个版本在其他的机器上都有,均没有问题。为排除IE的问题,将其中一台PC的IE重装,版本是IE6 SP1。没有解决问题。
为了排除系统其他系统文件引起IE出错,运行sfc命令,用win2k AS光盘恢复系统文件,重启,仍然不解决问题。
问题的焦点转到控件身上,在VC中运行ActiveX控件的源代码,不出错;考虑到debug和release的区别,用这两种版本都做了试验,在VC中均不出错。实际上,将编译生成的xxx.ocx文件拷贝到这台机器的任何目录,手工运行regsvr32.exe注册控件,再打开IE访问Web服务器均不出错。
关闭VC,注销控件,继续试验下去,发现打开login页面,下载控件结束后,不登录,直接关闭IE也会发生同样的问题,下次,哪怕关机重启后再运行都没问题。鉴于上述的现象,认为故障与页面后续脚本和控件代码的关系不大,关注的重心又回到客户端系统。
在客户端崩溃的时候,曾经尝试调试代码,查看堆栈内容, 从上至下依次为shdocvw.dll、browseUI.dll、user32.dll,都是系统进程,无从得知是什么地方导致错误的。
但是如何解决问题呢?其中一台PC的shdocvw.dll版本已经是已知最高的了,并且在重装IE6 SP1后,立即运行了windows update打了补丁。
观察了客户端安装的软件和运行的进程,没有发现很奇怪的东西。
问题究竟出在什么地方,各位有什么高见,请不吝赐教。谢谢!
您可能想查找下面的文章:
- 求救:在VC下,如何把VT_DATE型的_variant_t变量转化为CTime或_time_t型的变量?
- 求救,正在用mfc编写打印数据库报表的通用activex控件,寻求各位大侠帮助给出思路或相关资源,书籍
- 求救::为什么我的ocx的版本老是1,0,0,1呢,在程序里把version改了也不起作用。。。
- 求救哪位大虾,提供几个能下载ActiveX控件源代码的网址,偶要参考!(20分阿!)
- 求救:在MFC向导生成的容器程序中嵌入OfficeWord对象,关闭容器程序的时候,容器程序不能正常退出?
- 求救:vc调用msprojectMSPRJ9OLB/MSPRJLB看看我的代码错在何处请指教,在线等!!!!!!
- 求救:如何监测IE页面中的http的post/get等请求,并且获得相关信息(类似如一个IEwatch的软件)
- 求救,用MFC开发ActiveX控件,如何传递自定义结构体参数呀。。。。。。
- 求救,请高手来解决控件下载运行后IE崩溃的问题。分不够,可以再开贴啊,决不吝啬!
- 求救:IWebBrowser的DownloadComplete事件,没有参数,如何知道是哪一个IE窗口的?