问题描述:
MFC,C++dll开发的wince程序,在程序运行过程中,拔掉程序所在的sd卡,程序结束后,仍然在进程中存在,且杀不掉,除非重启机器。
过程描述:
一个简单的MFC程序,加载了1.dll,2.dll,3.dll。在WindowProc中获取消息WM_DEVICECHANGE,如果是该消息则调用ExitProcess(UINT(-1))退出。
- 如果程序只加载1.dll和2.dll,则程序在拔卡后能响应WM_DEVICECHANGE并正常退出。
- 如果程序加载了1.dll,2.dll和3.dll,则在拔卡调用ExitProcess(UINT(-1))能退出UI界面,但是进程还是存在,且杀不掉。
- 尝试过各种退出方式exit(0), sendmessage(WM_QUIT), sendmessage(WM_CLOSE), postmessage(WM_QUIT), postmessage(WM_CLOSE)均不能正常退出。
- 如果不是拔卡方式在任意botton响应函数中调用ExitProcess(UINT(-1))能够正常退出。
- 拔卡后日志显示DLL_PROCESS_DETACH正常执行完成。
- 3.dll中的接口没有在程序中被直接调用(程序刚初始化完成就拔卡),因此所谓的dll未完全加载导致某些函数无效的说法不能成立。
- 鉴于c++ global variable在dllmain开始前构造,在dllmain return后析构,查找了3.dll中的带构造和析构函数的全局变量共3个,发现日志确实卡在某个析构函数中,但把该析构函数注掉或者把3个全局变量全部注释掉,亦无法正常退出。
疑问:
异常拔出sd卡对程序运行到底有什么影响?
对于完全没有调用的dll,在加载和卸载时除了全局变量还有哪些未知的东西在加载和卸载?
2 个相关问题的链接:
posted on 2012-12-24 12:10
saha 阅读(378)
评论(1) 编辑 收藏 引用