/*** 请教ACTIVEFORM导致IE突然关闭的情况 ***/
在IE里面嵌个ACTIVEFORM,用着用着IE会忽然关闭,没有任何错误提示。请问各位有没有碰到过此类情况,如能告之,感激不尽! 问题点数:200、回复次数:15Top
1 楼jone7319(舍我其谁)回复于 2006-05-22 21:22:49 得分 20
试试看是不是这样Top
2 楼aniven(Compile Failed)回复于 2006-05-22 22:11:00 得分 10
很难说啊,有的时候IE上网时就是这样,可能和你的程序无关吧。Top
3 楼mywfool(阿赖耶识)回复于 2006-05-22 22:42:55 得分 0
应该有关的,因为有几个客户出现这种问题,我想不是偶然现象Top
4 楼myy()回复于 2006-05-22 22:52:48 得分 170
IE里面嵌ACTIVEFORM,最好不要同时开多个包含ACTIVEFORM的页面,因为 ACTIVEFORM 内部还是vcl ,vcl不是线程安全的(IE的每个窗口是独立线程),会有很多问题,特别是用到了vcl 的TPopMenu等控件,以及 Hint 等, 我为了解决这些问题,还改过 vcl 的源吗,痛苦...Top
5 楼jone7319(舍我其谁)回复于 2006-05-22 23:46:44 得分 0
http://www.hur.cn/web/program/cc/cc13/200511/7814.htmlTop
6 楼mywfool(阿赖耶识)回复于 2006-05-23 00:12:02 得分 0
to myy
1)控件里面确实用了多线程,但已经对共享数据做了临界区保护。(原来没做保护出现IE报XXX不可读/写错误)。
2)该控件没有使用任何可视控件,界面通过HTML实现,而且保证客户只开一个。
3)您说的BUG是关于ParkingWindow的吗?我在调试的时候发现有时不能初始化,后来加了段处理,现在这个问题已经好了。
其他想不出IE为何会突然关闭,希望知道的人告之……
Top
7 楼mywfool(阿赖耶识)回复于 2006-05-23 00:14:29 得分 0
jone7319(舍我其谁)您发的调试方法我已知道,谢谢。
其他人还有注意吗?Top
8 楼myy()回复于 2006-05-23 11:45:09 得分 0
不错,ParkingWindow 是很著名的 vcl/ocx BUG ,我的解决办法是修改了 atlvcl.h 中的代码:
TVclComControl<T, TVCL>::Initialize()
{
// Retrieve handle to reflector Window defined in AXCTRLS unit
//
HWND hwndParkingWindow = MyParkingWindow(); //用自己的过程代替
...
还要注意的是,控件的生存期受 ie 中页面的控制,ocx 相当于ie 动态载入的dll模块,比如页面刷新,ie 就会FreeLibrary / LoadLibrary,这时,控件中用到多线程就要要特别注意线程的控制,如果 ie 做 FreeLibrary 时,有线程还在继续运行,会死得很难看的!
我曾经写过一个ocx,内部有不能中断的后台心跳线程,最后采用的方法是修改了工程的主文件:
STDAPI __export DllCanUnloadNow(void)
{
return S_FALSE; // 为心跳线程,我野蛮地阻止了IE进程卸载我的OCX
//return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
Top
9 楼mywfool(阿赖耶识)回复于 2006-05-23 13:13:52 得分 0
呵呵,楼上的,我也改了这个文件,从代码里面取得这个变量的地址做修改,我是这样改的:
//VCL原来的代码注释掉
//HWND hwndParkingWindow = Axctrls::ParkingWindow();
//以下代码为手工添加
#define VclPackingWin (*(long*)(*(long*)((char*)(Axctrls::ParkingWindow) + 0x1C)))
HWND hwndParkingWindow = (HWND)VclPackingWin;
if (!IsWindow(hwndParkingWindow)) {
VclPackingWin = 0; //强制清空
hwndParkingWindow = Axctrls::ParkingWindow(); //重新分配
}
你说的另个问题我在看看是否有这种情况,非常感谢你Top
10 楼mywfool(阿赖耶识)回复于 2006-05-23 13:24:37 得分 0
现在客户没有刷新页面,也没有跳转到其他页面,所以ie应该还不会有加载和释放dll的过程。Top
11 楼ArWen()回复于 2006-05-23 23:20:01 得分 0
我以前也碰到这个问题,把所有控件的Hint与ShowHint清空即不再万事OK.Top
12 楼mywfool(阿赖耶识)回复于 2006-05-24 09:35:54 得分 0
谢楼上的,但现在已经是清空了。还有其他注意吗?Top
13 楼myy()回复于 2006-05-24 11:31:20 得分 0
我觉得楼主的问题可能还是线程的控制上有问题。
能否仔细说下情况?
比如,IE 关闭多发生在什么情况下(用户正在操作什么),操作系统环境等...
我在一个OA系统中也用到自制的多个ocx,bcb做的,很复杂,但除了用户的IE本身有问题,比如插件太多(3721...之类)等因素,在 98/2k/xp/2003,ie5.5/6 下,都很稳定。Top
14 楼mywfool(阿赖耶识)回复于 2006-05-24 22:15:53 得分 0
是这样的:程序使用了很多ACE里面的东西,用ACE的类连接到一台主机上,从这台主机不断接收消息,将收到的消息放入到一个消息队列中。另外一个线程不断从队列中取消息,当然已经对消息的进出做了临界区保护,然后触发事件,由JAVASCRIPT做相应处理。由于事件分发是在一个线程里面完成的,所以应该可以保证事件的执行是串行的,方法和事件的执行也做了保护。
现在的问题是:客户在使用时偶尔会发生IE突然关闭,且无任何错误提示的情况,真郁闷Top
15 楼mywfool(阿赖耶识)回复于 2006-05-24 22:16:37 得分 0
发生关闭的情况是随机的,什么情况下都可能出现Top




