MFC 关闭界面退出程序时,总是出现异常

黑暗时代fhp 2015-07-25 06:03:21


如上图所示,求解释!
我就运行MFC生成的exe文件,然后什么都没做,点击关闭按钮退出界面,结果就出现上图所示情况!
说一下:
运行exe文件时,从ini配置文件中读出数据,显示在对应的界面框框中。
关闭exe文件时,将界面上的数据保存到ini文件中,以及一些释放。
...全文
1311 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-28
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
赵4老师 2015-07-28
  • 打赏
  • 举报
回复
用depends.exe查看exe依赖的dll及其版本号。 楼主需要学习的东西还很多很多。
黑暗时代fhp 2015-07-28
  • 打赏
  • 举报
回复
引用 24 楼 zhao4zhong1 的回复:
不要追求在IDE中不弹窗报错。 只要直接运行不弹窗报错即可。
WinExec("taskkill /IM RO2Test.exe",SW_HIDE);
其实我并不是追求完美的人! 只是,令人费解的是,我在单步调试的时候,会出现异常! 直接把生成的exe运行起来,也是一样的异常! 奇怪的是,无意间拿到别人电脑上去运行,就好好的! oh my god。。。。 无解。。。 就这么结束吧!
难题 2015-07-28
  • 打赏
  • 举报
回复
把ONcancel去掉看看
飞翔的薄荷 2015-07-27
  • 打赏
  • 举报
回复
引用 9 楼 fhplzh 的回复:
[quote=引用 8 楼 ml232528 的回复:] 关闭的时候,某些对象先释放,导致后面的对象无法访问。 楼主单步调试下看看在哪里报的错。
单步调试的话,onclose中一直进行到最后一个“}”,如下图所示,继续点击F5,便跳出异常 [/quote] 还有个笨方法,那就是注释代码。注释掉一些代码,编译后在看有没有问题,这种方法比较耗费时间。
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
引用 7 楼 fengxuxing 的回复:
这种问题多为析构顺序引起,或者发生在多线程未能正常停止的情况下,建议如下: (1)根据构造顺序,反向进行析构; (2)析构函数中,将指针类型的对象删除后,赋值为NULL; (3)加入minidump,直接查出出错的地方。
是这样的,析构函数我全用的是VS2005添加界面时,自动生成的,没有去修改过。我猜想,应该不会是我析构函数出现问题所致吧! 你说的第三点,不太会用
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
引用 8 楼 ml232528 的回复:
关闭的时候,某些对象先释放,导致后面的对象无法访问。
楼主单步调试下看看在哪里报的错。

单步调试的话,onclose中一直进行到最后一个“}”,如下图所示,继续点击F5,便跳出异常
飞翔的薄荷 2015-07-27
  • 打赏
  • 举报
回复
关闭的时候,某些对象先释放,导致后面的对象无法访问。 楼主单步调试下看看在哪里报的错。
Qlaiaqu 2015-07-27
  • 打赏
  • 举报
回复
这种问题多为析构顺序引起,或者发生在多线程未能正常停止的情况下,建议如下: (1)根据构造顺序,反向进行析构; (2)析构函数中,将指针类型的对象删除后,赋值为NULL; (3)加入minidump,直接查出出错的地方。
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
引用 5 楼 sandshaw 的回复:
退出的时候在onclose那设断点试试, 或者你有没有onDestory()函数. 窗口销毁有资源没有释放会引起内存泄漏
我在onclose中设置断点,都是结束onclose时,继续F5的时候,就出现异常(正常应该是关闭程序)。 我没有用到onDestory()函数
sandshaw 2015-07-27
  • 打赏
  • 举报
回复
退出的时候在onclose那设断点试试, 或者你有没有onDestory()函数. 窗口销毁有资源没有释放会引起内存泄漏
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:
OnClose(MFC关闭响应函数)
和所有有关的析构函数



引用 2 楼 zxh707wk 的回复:
引用 1 楼 paschen 的回复:
检查下析构函数等里指针的访问是否有问题
+1


引用 1 楼 paschen 的回复:
检查下析构函数等里指针的访问是否有问题


析构函数,我觉得我程序上应该不存在指针的访问问题!
析构函数里,都是系统自动生成的,我没去修改,以及添加任何命令。
比如:
CRO2TestDlg::~CRO2TestDlg()
{
}


然后onclose函数里,如下图所示,其实就很简单的,可是,就是不懂哪里出了问题,界面关闭完,就出现错误提示。。。
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
不要追求在IDE中不弹窗报错。 只要直接运行不弹窗报错即可。
WinExec("taskkill /IM RO2Test.exe",SW_HIDE);
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
引用 22 楼 y420654980 的回复:
我觉得最后2行代码可能有问题,你只调用OnCancel()或者只调用OnClose()试试,如果还不行就2行都去掉调OnOk()试试,说实话,我到现在都没明白Oncancel()和OnOk()2个函数底层到底有哪些不同,有哪个大牛能给我讲讲
疯掉,你说的都试了, 依旧是,,,,不行
Xlerrn 2015-07-27
  • 打赏
  • 举报
回复
我觉得最后2行代码可能有问题,你只调用OnCancel()或者只调用OnClose()试试,如果还不行就2行都去掉调OnOk()试试,说实话,我到现在都没明白Oncancel()和OnOk()2个函数底层到底有哪些不同,有哪个大牛能给我讲讲
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
提醒:多线程程序退出,该加锁的加锁,该WaitForSingleObject的WaitForSingleObject
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
楼主直接关机或拔电,我就不信你的程序还能弹出什么对话框! 楼主你实在想浪费一大截生命,追求相对比较优雅的退出的话, 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 + 啃《Windows核心编程》
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
system("taskkill /IM RO2Test.exe"); 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
黑暗时代fhp 2015-07-27
  • 打赏
  • 举报
回复
回复15、16楼:你说的exit()情况,我都试过了!只要单步执行,一执行到exit,就出现如我前面所截图的情况(见14楼)
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
TerminateProcess The TerminateProcess function terminates the specified process and all of its threads. BOOL TerminateProcess( HANDLE hProcess, // handle to the process UINT uExitCode // exit code for the process ); Parameters hProcess Handle to the process to terminate. Windows NT: The handle must have PROCESS_TERMINATE access. uExitCode Specifies the exit code for the process and for all threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value. Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Remarks The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess. TerminateProcess causes all threads within a process to terminate, and causes a process to exit, but DLLs attached to the process are not notified that the process is terminating. Terminating a process causes the following: All of the object handles opened by the process are closed. All of the threads in the process terminate their execution. The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate. The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate. The termination status of the process changes from STILL_ACTIVE to the exit value of the process. Terminating a process does not cause child processes to be terminated. Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed. Windows CE: Windows CE does not support exit codes for processes, so the uExitCode parameter is ignored. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winbase.h. Import Library: Use kernel32.lib. See Also Processes and Threads Overview, Process and Thread Functions, ExitProcess, OpenProcess, GetExitCodeProcess, GetExitCodeThread
加载更多回复(8)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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