posts - 0,  comments - 5,  trackbacks - 0
问题描述:
   MFC,C++dll开发的wince程序,在程序运行过程中,拔掉程序所在的sd卡,程序结束后,仍然在进程中存在,且杀不掉,除非重启机器。
过程描述:
   一个简单的MFC程序,加载了1.dll,2.dll,3.dll。在WindowProc中获取消息WM_DEVICECHANGE,如果是该消息则调用ExitProcess(UINT(-1))退出。
  1. 如果程序只加载1.dll和2.dll,则程序在拔卡后能响应WM_DEVICECHANGE并正常退出。
  2. 如果程序加载了1.dll,2.dll和3.dll,则在拔卡调用ExitProcess(UINT(-1))能退出UI界面,但是进程还是存在,且杀不掉。
  3. 尝试过各种退出方式exit(0), sendmessage(WM_QUIT), sendmessage(WM_CLOSE), postmessage(WM_QUIT), postmessage(WM_CLOSE)均不能正常退出。
  4. 如果不是拔卡方式在任意botton响应函数中调用ExitProcess(UINT(-1))能够正常退出。
  5. 拔卡后日志显示DLL_PROCESS_DETACH正常执行完成。
  6. 3.dll中的接口没有在程序中被直接调用(程序刚初始化完成就拔卡),因此所谓的dll未完全加载导致某些函数无效的说法不能成立。
  7. 鉴于c++ global variable在dllmain开始前构造,在dllmain return后析构,查找了3.dll中的带构造和析构函数的全局变量共3个,发现日志确实卡在某个析构函数中,但把该析构函数注掉或者把3个全局变量全部注释掉,亦无法正常退出。


疑问:
    异常拔出sd卡对程序运行到底有什么影响?
    对于完全没有调用的dll,在加载和卸载时除了全局变量还有哪些未知的东西在加载和卸载?

2 个相关问题的链接:

http://social.microsoft.com/Forums/zh-HK/mobilezhcht/thread/39c99337-b8ee-4455-b516-b6c630148b15
http://blog.csdn.net/iiprogram/article/details/2633022

基本
结论:
   拔卡对于程序确实有影响。由于wince的虚拟内存机制,拔了卡会导致某些接口无效,从而导致程序崩溃。
   只有全局变量在dll加载前加载。


 

posted on 2012-12-24 12:10 saha 阅读(359) 评论(1)  编辑 收藏 引用

FeedBack:
# re: WINCE疑难问题:异常拔卡的处理[未登录]
2012-12-24 20:10 | jacky
把帖子转到 看雪论坛上看看 ,那里有些破解的高手   回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿

文章分类

文章档案

收藏夹

搜索

  •  

最新评论