我做的OCX,在IE里运行良好,但是关闭IE时,会出现IE的“崩溃”窗口

huangbeyond 2003-02-11 04:50:29
我自己做的OCX,在IE里运行时一切正确;但是当我去关闭IE时,IE在成功关闭该OCX后,在全部界面消失后,却出现一个“崩溃”窗口。“应用程序错误,xxxx指令引用的xxxx内存。该内存不能为Read”.

这个BUG非常难排除,是因为它出现在OCX关闭之后,所以VC的断点调试对它毫无作用。我当然知道是我的OCX导致的,但是我却无法定位是OCX代码哪里写错了。

希望曾经遇过这种情况,或者有经验的朋友能够提供一些思路。或者能够告诉我一些“OCX的什么情况会在卸出时能使IE崩溃”

有关我的OCX:
OCX在运行时刻还调用了几个也是自己写的“扩展MFC-DLL”
...全文
578 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sander 2003-03-05
  • 打赏
  • 举报
回复
如果出错,进入调试。根据fielmap,可以查到出错的地方。
二。使用map file 找 crash information
具体做法:用release版,打开project setting(Alt+F7)
在Link Tab 选 "Generate mapfile" option
在C/C++ Tab Project option:打 /MAPINFO:LINES /MAPINFO:EXPORTS
recompile.
通过运行中的提示信息,可以找到程序crash的地方
Good Luck!
林仪明 2003-03-05
  • 打赏
  • 举报
回复
up
3jaja 2003-03-05
  • 打赏
  • 举报
回复
你的OCX是否读写字串,是否读写出边界线,加大数组内存试试。
huangbeyond 2003-03-05
  • 打赏
  • 举报
回复
问题终于解决了。。。。。。。。。。。。。

现在把原因解释一下,以避免后来者再犯。

我的OCX调用了几个DLL(MFC扩展),而就在其中一个DLL里,使用SetTimer();就是这个SetTimer(),它使用的计时器并不是挂靠在HWND上,而是纯粹使用CALLBACK;当IE(或者)别的OLE容器把OCX卸载出进程空间时,这个DLL中的CALLBACK-proc代码所占用的内存空间自然也被COM管理器清空了,然而,就是这个Timer却没有调用KillTimer()(疏忽?还是遗漏,我不清楚,那些代码非我所写)。于是,系统所发出的TIMER_MESSAGE依然地向那个已经被清空的地址进行调用,自然就发生了崩溃!!然而此时,DLL和OCX都已经被卸掉了,于是崩溃就出现在IE里,甚至不能算是IE,而是Kernel32.dll,因为timer就是由它发出的。

于是,我在OCX退出时,执行一次KillTimer,一切就OK了。(天,我搞了一个月,FUCK,如果是几千行代码,我早就翻它出来了,20多万行啊!!!要我怎么去翻?!)

再说说“EXE程序为什么不崩溃”。很显然,EXE程序在卸除DLL之时,自身的main-thread和一切的一切都已经结束了,所以就不会再发生CALLBACK。


mashimaro3600(爱吃白菜||杀尽贪官)前面说的那种情况,和我的非常类似(尽管现象不是一样的)。其中,我测试过资源泄露的问题,就是没有想到去观察“活动的对象”。还是非常感谢你。

88dd(巴迪) 是一位热心肠的朋友,我的好几个求助的贴子里有你热心的帮助,谢谢你!!

也谢谢其它热心的朋友。

我这就结贴,分不多,望各位海涵。
88dd 2003-03-05
  • 打赏
  • 举报
回复
不是
http://MS.VSCC....

ms-help://MS.VSCC....

如果装了
Visual Studio.NET MSDN 就有。


或者去微软的网站
http://msdn.microsoft.com/code/default.asp?URL=/code/sample.asp?url=/MSDN-FILES/026/001/961/msdncompositedoc.xml
mashimaro3600 2003-03-04
  • 打赏
  • 举报
回复
其实老汉作的ocx也有毛病,只不过我在退出时强制停留了 x个500ms, 以便我呼叫的dll里的主控线程得到控制权来回收内存-----我的ocx如果不停留 80%要崩

http://www.xhsoft.net/news8.htm

要是你泄在mfc里,你干脆改成delphi写算了,你都挨了快一个月了~~
huangbeyond 2003-03-04
  • 打赏
  • 举报
回复
TO: 88dd(巴迪)
http://MS.VSCC/MS.MSDNVS/vcsample/html/vcsmpTSTCONActiveXControlTestContainer.htm
好像打不开..... :)
huangbeyond 2003-03-04
  • 打赏
  • 举报
回复
TO: 88dd(巴迪)
其实不用去编译debug版的ActiveX Control test container.
我已经使用了一个内嵌我的OCX的EXE来调试了.
最后发现:崩溃出现在Kernel32.dll里....................

还有一点痕迹就是:OCX在被容器调用完成后,检测有比较多的内存/资源泄露,但是,这些泄漏都是发生在MFC的源代码里,

我该怎么办?!?!
88dd 2003-03-04
  • 打赏
  • 举报
回复
ms-help://MS.VSCC/MS.MSDNVS/vcsample/html/vcsmpTSTCONActiveXControlTestContainer.htm

编译一个debug版的ActiveX Control test container调试看看
huangbeyond 2003-03-04
  • 打赏
  • 举报
回复
使用ActiveX Control test container调试,
依然有error.

出错地址总是:
C0000005,C0000006
88dd 2003-03-03
  • 打赏
  • 举报
回复
1.IE在没有用到ActiveX控件时崩溃的情况也不少见
2.最好几个扩展库和OCX同时编译成Debug版或Release版
huangbeyond 2003-03-03
  • 打赏
  • 举报
回复
to: 88dd(巴迪)
(谢谢你的关注)
我用的无论是DEBUG还是RELEASE都崩溃。
蝈蝈太阳 2003-03-03
  • 打赏
  • 举报
回复
GZ
88dd 2003-03-02
  • 打赏
  • 举报
回复
调用的扩展DLL用的是debug版还是release版
88dd 2003-03-02
  • 打赏
  • 举报
回复
你们写的JavaScript多不多
再有页面上有没有用Frame和IFrame
huangbeyond 2003-03-02
  • 打赏
  • 举报
回复
现在我们部门在全力攻这个问题,
但是还是没有结果............
huangbeyond 2003-02-27
  • 打赏
  • 举报
回复
一直没有找到原因,我要死了。。。。。。。。。。。。
Sander 2003-02-27
  • 打赏
  • 举报
回复
我的两点建议:
一。使用VC提供的ActiveX Control test container调试。让它关闭,看有没有error.
二。使用map file 找 crash information
具体做法:用release版,打开project setting(Alt+F7)
在Link Tab 选 "Generate mapfile" option
在C/C++ Tab Project option:打 /MAPINFO:LINES /MAPINFO:EXPORTS
recompile.
通过运行中的提示信息,可以找到程序crash的地方
Good Luck!
tszsj 2003-02-27
  • 打赏
  • 举报
回复
呵呵是不是你的COM有析构函数啊,而且是virtual的,如果是这样退出的时候肯定死机哦。
析构代码要在FinalRelease()中哦。
bakerking 2003-02-24
  • 打赏
  • 举报
回复
除了调试析构函数,还要调试退出函数exitinstance等,另外,启动activex工程,把IE作为调试器,然后观测TRACE调试输出,如果找到GetLastErrorCode()或者找到出错前最后的代码都有作用的
加载更多回复(19)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧