(1000+分)奇怪问题,EXE调DLL,DLL中窗体关闭时程序死掉. (帮忙UP) (300分)

Y

ysai

Unregistered / Unconfirmed
GUEST, unregistred user!
只用到了两个第三方组件:DevExpress,FastReport<br>EXE调用DLL中的窗体,显示在EXE中的一个Panel上.关闭时程序失去响应.不占CPU资源.<br>DLL比较多,但只有其中2-3个才会出现下述现象.而这2,3个与正常的相比,在代码上没有特殊的地方.<br>程序中很少用到多线程,一般都是在主线程中操作<br><br>A,B,C,D 4台机器代表4种情况<br><br>A为开发的机器,XP,D7,曾经出现过死掉,但近段没有一次重现.<br><br>B为测试机器,双系统,XP里某些DLL中的窗口关闭会死掉,有时候第一次关闭不死,多打开再关闭几次就死,装上D7后,在调试环境下不死(设不设断点一样,=没办法跟踪),直接运行EXE死.2000系统不死.<br><br>C和D:都为XP,为多台机器的两种情况,C死,A机器重新编译代码(不修改任何东西,只是加个空格再删除,保存编译,结果文件大小不同,发布),C就可能不死了,但....D又死,再重新编译,可能又换过来.不死掉的话肯定不会出问题,死掉的是有机会出问题,机率比较大,不能忍受.<br><br>以上现象,基本可以排除代码原因,程序死掉时Socket服务可以看到客户端已经正常关闭连接,排除Socket连接问题.日志表明窗体执行了Close,然后Hide,但未Destroy.<br><br>请各位DFW帮忙想想,可能是什么原因造成的?我快崩溃了.<br>编译选项有什么可以设置的?为什么不修改任何代码,编译出来的目标文件会有不同?
 
奇怪,没遇道过,想想看先。
 
你是不是把DevExpress的组件放在DLL中了?DevExpress组件只要用到皮肤的,都不能放在DLL中,否则在调用DLL之后,会发生程序异常。
 
楼上的朋友,请问你说的异常是一定发生吗?我的情况并不会发生异常,只会让程序死掉.<br>而且不是在调用时产生异常,只是在关闭时死,即使我切换皮肤也不会有任何问题.<br><br>该死的是,不一定发生,无法跟踪,不同的电脑出现不同的情况,同一电脑不同操作系统也不同!简直是在玩我5555555
 
正是这样。它在释放DLL的时候会发生异常情况,甚至让程序死掉。你可以试试把放在DLL中的Dev组件和单元去掉,再测试一下。
 
你试一下吧。我在XP中做程序时,也像你这样,有时会报错,但有时会不报错。不报错的情况多出现在不使用皮肤的环境下(可以在桌面设置中切换到Windows经典),但也会偶尔地报一下错误。
 
已经不可能不用DevExpress组件了:(<br>项目中用到它太多了<br><br>不知道Dev官方有没有解决方案
 
可能是程序中内存释放有问题。检查一下吧。<br>
 
我估计它的原理是这样的:大部分可以切换设置外观的组件因为都可以通过一个共有的组件来统一设置,因此,每个这样的Dev组件都在创建时寻找这个设置组件,并根据它的值来确定自身的风格。在释放的时候,也同样需要释放对这个控件的引用。这样就引发了一个问题,只要这个风格设置控件在同一个进程中时,就可以安全地释放引用,但如果存在在两个进程中时,一个进程的释放会引发另外一个窗体无法正常继续它的风格引用,因此而触发异常。<br>目前解决的唯一办法只有做在一个EXE文件中,才能够避免。但这样,EXE文件无疑会特别大,尤其是DEV组件本身就要占用大量的空间。
 
DLL中是否用到了SocketConnection?
 
TO谢方:<br>&nbsp; &nbsp; EXE中的外观控制器不会影响DLL中组件的外观,我在每个DLL中都有独立的控制器.<br><br>TO ChinaBean:<br>&nbsp; &nbsp; 用到了.有什么问题?
 
学习学习
 
会的,一定会的。你随便做一个简单的动态链接库试试,把里面的LookAndFeel属性的NativeStyle设为True,就会在程序退出的时候引发异常,不管你DLL中窗体上是否有风格设置组件。
 
TO 谢方:<br>&nbsp; &nbsp; 那个属性我试着改过,但不会出错,可能是因为我DLL中有独立的cxLookAndFeelController吧.<br><br>但愿是我的代码的问题,而不是DevExpress组件的问题,否则我就惨了.
 
估计你没有报错而是死掉就是这个原因吧?我试了很多遍,只要用上带有这个属性的组件并把它设为True,退出程序时一定会报错!不设为True的话则不会。
 
如果用了SocketConnetion, 请将其SupportCallBacks属性设为False,否则程序会在关闭后3分钟才退出,在这段时间内就象死了一样
 
我也用过Dev的控件做动态库,NativeStyle设为True是不会出现任何问题的,但是只要使用了cx开头的控件则在Win2000下TWinControl控件的级数就必须要控制在12层,再多一层就会在Resize时出现我现在无法解决的错误,主要原因是cxContainers的Initialization有一个函数调用了SetWindowsHookEx这个API,否则级数可达23层,但到了47层在设计时都会出错<br>12 * 2 = 24 ~~ 23<br>23 * 2 = 46 ~~ 47<br>这可能是操作系统的Bug,在Win2003下这三个数为 17, 32 和 96<br>但在98下则没有任何问题,不知各位大侠是否遇到过<br>具体主请看<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2598460
 
这应该与你的DLL中窗体的初始化,还有释放有关。<br>我在做COM程序的时候,调用DLL内部的窗体,也曾经出现过奇怪的现象,不过和你的不太一样。
 
TO ChinaBean:<br>&nbsp; &nbsp; SocketConnetion的断开BUG我已经修改过了,不会再有问题.<br>&nbsp; &nbsp; 我的控件的层次也没达到那么多层次,只是继承了2到4层.<br><br>TO suocy5:<br>&nbsp; &nbsp; 窗体的初始化与释放都是在DLL中控制的,EXE不会直接控制,最多发个消息给DLL中的窗体,而且能PostMessage的都是用的PostMessage.<br><br>很奇怪的问题,主要是无法调试,无从下手,能猜的都试了,大家再猜猜可能的原因,谢谢
 
顶部