問題描述:
MFC,C++dll開發(fā)的wince程序,在程序運行過程中,拔掉程序所在的sd卡,程序結(jié)束后,仍然在進程中存在,且殺不掉,除非重啟機器。
過程描述:
一個簡單的MFC程序,加載了1.dll,2.dll,3.dll。在WindowProc中獲取消息WM_DEVICECHANGE,如果是該消息則調(diào)用ExitProcess(UINT(-1))退出。
- 如果程序只加載1.dll和2.dll,則程序在拔卡后能響應(yīng)WM_DEVICECHANGE并正常退出。
- 如果程序加載了1.dll,2.dll和3.dll,則在拔卡調(diào)用ExitProcess(UINT(-1))能退出UI界面,但是進程還是存在,且殺不掉。
- 嘗試過各種退出方式exit(0), sendmessage(WM_QUIT), sendmessage(WM_CLOSE), postmessage(WM_QUIT), postmessage(WM_CLOSE)均不能正常退出。
- 如果不是拔卡方式在任意botton響應(yīng)函數(shù)中調(diào)用ExitProcess(UINT(-1))能夠正常退出。
- 拔卡后日志顯示DLL_PROCESS_DETACH正常執(zhí)行完成。
- 3.dll中的接口沒有在程序中被直接調(diào)用(程序剛初始化完成就拔卡),因此所謂的dll未完全加載導(dǎo)致某些函數(shù)無效的說法不能成立。
- 鑒于c++ global variable在dllmain開始前構(gòu)造,在dllmain return后析構(gòu),查找了3.dll中的帶構(gòu)造和析構(gòu)函數(shù)的全局變量共3個,發(fā)現(xiàn)日志確實卡在某個析構(gòu)函數(shù)中,但把該析構(gòu)函數(shù)注掉或者把3個全局變量全部注釋掉,亦無法正常退出。
疑問:
異常拔出sd卡對程序運行到底有什么影響?
對于完全沒有調(diào)用的dll,在加載和卸載時除了全局變量還有哪些未知的東西在加載和卸載?
2 個相關(guān)問題的鏈接:
posted on 2012-12-24 12:10
saha 閱讀(393)
評論(1) 編輯 收藏 引用