百思不得其解 Unhandled exception in XX.exe(NTDLL.DLL): 0xC0000005:Access Violation.

xjchilli 2008-10-16 10:41:35
自已写了一个win32 dll. 另写了一个测试程序,测试程序中有几个按钮,在测试程序关闭前点击一下按钮调用dll中的一个函数,清理dll中正在做的工作,然后点关闭按钮,这样退出没问题。

但若把调用dll函数(清理dll中正在做的工作)放置于OnClose(),OnOk()中就会弹出一对话框 Unhandled exception in XX.exe(NTDLL.DLL): 0xC0000005:Access Violation.
若把调用dll函数(清理dll中正在做的工作)放置于OnDestroy()中,根本就不会执行到那去,程序好像是退出了,但实际进程还在。
请问如何做。。。
(Unhandled exception in XX.exe(NTDLL.DLL): 0xC0000005:Access Violation. 中的XX.exe即我的测试程序名称)
...全文
1548 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
牛 魔 王 2012-03-16
  • 打赏
  • 举报
回复
同求!!
zllwuteng 2011-08-08
  • 打赏
  • 举报
回复
求解释,我也遇到这个问题,看代码看了三天,都没看出了
在debug下可以,在release下就是不行啊
绿豆蛙2013 2009-10-05
  • 打赏
  • 举报
回复
楼主,咋解决的,俺也碰到了同样的问题啊
ysu_xzw 2009-09-16
  • 打赏
  • 举报
回复
怎么解决的呀,楼主
xjchilli 2008-10-20
  • 打赏
  • 举报
回复
谢谢各位,最后在我哥的帮助下问题解决了。。。谢谢了。。。现在把分分给大家好了。
scq2099yt 2008-10-16
  • 打赏
  • 举报
回复
OnDestroy()只是销毁对话框,对象还是有存在。

注意3楼的问题
野男孩 2008-10-16
  • 打赏
  • 举报
回复
得有代码才能定位。

可以看看我的这篇blog: 实战:结合Dr.Watson系统日志和Vc6来定位多线程环境下程序异常退出的错误
http://blog.csdn.net/coding_hello/archive/2008/09/29/2994158.aspx
gellf 2008-10-16
  • 打赏
  • 举报
回复
怎么加载和卸载DLL的?

dll应该已经被释放了。
我是苦力 2008-10-16
  • 打赏
  • 举报
回复
3楼高手
菜牛 2008-10-16
  • 打赏
  • 举报
回复
具体代码
zhoujianhei 2008-10-16
  • 打赏
  • 举报
回复
OnClose()
{
// 放到这里
Cxx::OnClose();
// 别放在这
}

我是苦力 2008-10-16
  • 打赏
  • 举报
回复
应该是资源释放的问题,具体没有去试过。
不会在调用清理函数之前就释放了dll吧
洗洗睡去 2008-10-16
  • 打赏
  • 举报
回复
内存泄漏?
whoo 2008-10-16
  • 打赏
  • 举报
回复
逻辑问题,一定会出错。

原因是Dll的释放函数,需要走好几个消息循环才能执行完毕。也就是释放函数执行完返回之后,还需要几个消息循环,释放操作才能执行完毕。

所以这么设计的DLL释放函数,不能放在主程序结束过程中,因为主程序结束的很快,Dll还等着下一个消息来继续释放呢主程序就没了。


改进的方式,一个是从主程序着手,给予充足的释放时间;另一方面从dll着手,置一释放OK标记,主程序检测到这个OK标记前不能退出,如果必要,还要保持消息循环。
xjchilli 2008-10-16
  • 打赏
  • 举报
回复
使用SendMessage(hwnd, WM_CLOSE, 0, 0); 结果也是一样的
xjchilli 2008-10-16
  • 打赏
  • 举报
回复
PostMessage(hwnd, WM_CLOSE, 0, 0); 中的hwnd并不是调用端的句柄,只是dll中的一个句柄而以
xjchilli 2008-10-16
  • 打赏
  • 举报
回复
不是啊。。。这是另外一个dll,不调用的话这个dll是不会退出来的,因为他有自己的消息处理机制
cnzdgs 2008-10-16
  • 打赏
  • 举报
回复
如果在OnClose之后调用,就不要再发关闭消息了。另外PostMessage是把消息放到队列中而不是立即处理,最好尽量用SendMessage。
xjchilli 2008-10-16
  • 打赏
  • 举报
回复
大家看下,具体代码如下:
dll中的函数:
extern "C" __declspec( dllexport ) void FreeVNCLibrary()
{
if( hAppInstance && menu )
{
SendMessage( menu->m_hwnd, WM_COMMAND,(WPARAM)MAKEWPARAM( ID_CLOSE, 0 ),0 );
Sleep( 2000 );
}
}
SendMessage( menu->m_hwnd, WM_COMMAND,(WPARAM)MAKEWPARAM( ID_CLOSE, 0 ),0 );会调用如下代码段:
case ID_CLOSE:
// User selected Close from the tray menu
_this->m_server->KillAuthClients();
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case WM_CLOSE:

// Only accept WM_CLOSE if the logged on user has AllowShutdown set
if (!_this->m_properties.AllowShutdown())
{
return 0;
}
// tnatsni Wallpaper fix
RestoreWallpaper();
break;
////////////////////////////////////////////////////////////////////////////////////
上面的this是类menu对象
cnzdgs 2008-10-16
  • 打赏
  • 举报
回复
“清理dll中正在做的工作”具体是什么?贴代码。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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