CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  ActiveX/COM/DCOM

/*** 请教ACTIVEFORM导致IE突然关闭的情况 ***/

楼主mywfool(阿赖耶识)2006-05-22 20:34:17 在 C++ Builder / ActiveX/COM/DCOM 提问

在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

相关问题

关键词

得分解答快速导航

  • 帖主:mywfool
  • jone7319
  • aniven
  • myy

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo