進(jìn)程只是提供了一段地址空間和內(nèi)核對象,其運(yùn) 行時通過其他地址空間內(nèi)的主線程來體現(xiàn)的。當(dāng)主線程的進(jìn)入點(diǎn)函數(shù)返回時,進(jìn)程也就隨之而技術(shù)。這種進(jìn)程的種植方式是進(jìn)程的正常退出。進(jìn)程中的所有縣城資源 都能夠得到正確的清除。除了這種進(jìn)程的正常退出方式之外,優(yōu)勢還需要在程序中通過代碼來強(qiáng)制結(jié)束本進(jìn)程或其他進(jìn)程的運(yùn)行。
ExitProcess
void ExitProcess(UINT uExitCode);
其 參數(shù)uExitCode為進(jìn)城設(shè)置了退出代碼。該函數(shù)具有強(qiáng)制性,在執(zhí)行完畢后進(jìn)程即被結(jié)束,因此位于其后的任何代碼將不能被執(zhí)行。雖然 ExitProcess()函數(shù)可以再結(jié)束進(jìn)程同時通知與其關(guān)聯(lián)的動態(tài)鏈接庫,但是由于他的這種強(qiáng)制性,使得ExitProcess()函數(shù)在使用上將存 有安全隱患。例如,如果最親愛程序調(diào)用ExitProcess()函數(shù)之前曾用new操作,申請一段空間,那么敬愛那個會由于ExitProcess() 函數(shù)的強(qiáng)制性而無法通過delete操作符將其釋放,從而造成內(nèi)存泄露。
有鑒于ExitProcess()函數(shù)的強(qiáng)制性和安全性,在使用時一定要引起注意。
Terminateprocess()
ExitProcess 只能強(qiáng)制本進(jìn)程的推出,如果要在一個進(jìn)程中強(qiáng)制結(jié)束其他的進(jìn)程就需要用TerminateProcess()來實現(xiàn),與ExitProcess()不 同,TerminateProcess()函數(shù)執(zhí)行后,被終止的進(jìn)程不會得到任何關(guān)于程序退出的通知。也就是說,被終止的進(jìn)程是無法再結(jié)束運(yùn)行前進(jìn)程推出 前的收尾工作的。所以,通常只有在其他任何地方都無法迫使進(jìn)程退出時才會考慮使用TerminateProcess()去強(qiáng)制結(jié)束進(jìn)程。
BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
參 數(shù)hProcess和uExitCode分別為進(jìn)城句柄和退出代碼。如果被結(jié)束的是本進(jìn)程,可以通過GetCurrentProcess()獲取到句柄。 TerminateProcess()是異步執(zhí)行的,在調(diào)用后返回并不能確定被終止進(jìn)程是否已經(jīng)真的退出,如果調(diào)用TerminateProcess() 的進(jìn)程對此細(xì)節(jié)關(guān)心,可以通過WaitForSingleObject()來等待進(jìn)程的真正結(jié)束。
在VC中如何結(jié)束系統(tǒng)正在運(yùn)行的其他進(jìn)程(該進(jìn)程必須有窗口界面),其實很簡單,按照如下步驟進(jìn)程:
1)取得進(jìn)程的句柄(利用FindWindow函數(shù)得到);
2)獲取進(jìn)程ID號(用GetWindowThreadProcessId函數(shù)獲?。?;
3)打開進(jìn)程,OpenProcess函數(shù)中的第一個參數(shù)設(shè)為PROCESS_TERMINATE,就可以獲取處理該進(jìn)程的句柄;
4)利用TerminateProcess函數(shù)結(jié)束進(jìn)程,將該函數(shù)的第二個參數(shù)設(shè)為4.