問(wèn)題描述:
MFC,C++dll開(kāi)發(fā)的wince程序,在程序運(yùn)行過(guò)程中,拔掉程序所在的sd卡,程序結(jié)束后,仍然在進(jìn)程中存在,且殺不掉,除非重啟機(jī)器。
過(guò)程描述:
一個(gè)簡(jiǎn)單的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界面,但是進(jìn)程還是存在,且殺不掉。
- 嘗試過(guò)各種退出方式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中的接口沒(méi)有在程序中被直接調(diào)用(程序剛初始化完成就拔卡),因此所謂的dll未完全加載導(dǎo)致某些函數(shù)無(wú)效的說(shuō)法不能成立。
- 鑒于c++ global variable在dllmain開(kāi)始前構(gòu)造,在dllmain return后析構(gòu),查找了3.dll中的帶構(gòu)造和析構(gòu)函數(shù)的全局變量共3個(gè),發(fā)現(xiàn)日志確實(shí)卡在某個(gè)析構(gòu)函數(shù)中,但把該析構(gòu)函數(shù)注掉或者把3個(gè)全局變量全部注釋掉,亦無(wú)法正常退出。
疑問(wèn):
異常拔出sd卡對(duì)程序運(yùn)行到底有什么影響?
對(duì)于完全沒(méi)有調(diào)用的dll,在加載和卸載時(shí)除了全局變量還有哪些未知的東西在加載和卸載?
2 個(gè)相關(guān)問(wèn)題的鏈接:
posted on 2012-12-24 12:10
saha 閱讀(381)
評(píng)論(1) 編輯 收藏 引用