問題描述:
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 閱讀(381)
評論(1) 編輯 收藏 引用