美國(guó)優(yōu)秀網(wǎng)站教你如何建立網(wǎng)站
我先給一個(gè)代碼,你可以直接用,什么不用管了
static void kill_process_by_name(char *name)
{PROCESSENTRY32 pe32 = {0};//聲明一個(gè)結(jié)構(gòu)體,用來(lái)存放快照進(jìn)程信息的一個(gè)結(jié)構(gòu)體HANDLE hsnap = NULL;pe32.dwSize = sizeof(pe32);//指定結(jié)構(gòu)體的大小hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到系統(tǒng)進(jìn)程快照的句柄if (hsnap == INVALID_HANDLE_VALUE) return; //獲取句柄失敗BOOL ret = Process32First(hsnap, &pe32);//查找系統(tǒng)進(jìn)程快照中的第一個(gè)進(jìn)程while (ret) {if (stricmp(pe32.szExeFile, name) == 0) {//判斷進(jìn)程的名稱是不是一樣HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); //打開(kāi)一個(gè)已存在的進(jìn)程對(duì)象,并返回進(jìn)程的句柄TerminateProcess(h, 0); //終止進(jìn)程CloseHandle(h); //關(guān)閉句柄}ret = Process32Next(hsnap, &pe32); //查找下一個(gè)}CloseHandle(hsnap);
}
從此之后你只有傳入進(jìn)程的名稱,就可以強(qiáng)制關(guān)閉這個(gè)進(jìn)程了。如果你有空并且還想深究,請(qǐng)認(rèn)真往下看,定會(huì)讓你獲益匪淺。
查看系統(tǒng)所有進(jìn)程的ip和名字
void CTestDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知處理程序代碼//打開(kāi)控制臺(tái),設(shè)置可以往控制臺(tái)寫(xiě)入,顯示數(shù)據(jù)AllocConsole();freopen("CON", "r", stdin);freopen("CON", "w", stdout);freopen("CON", "w", stderr); char name[50]{};int i{};PROCESSENTRY32 pe32 = { 0 };//聲明一個(gè)結(jié)構(gòu)體HANDLE hsnap = NULL; pe32.dwSize = sizeof(pe32); //指定結(jié)構(gòu)體大小hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到系統(tǒng)進(jìn)程快照的句柄if (hsnap == INVALID_HANDLE_VALUE) return; //獲取句柄失敗BOOL ret = Process32First(hsnap, &pe32);//查找系統(tǒng)進(jìn)程快照中的第一個(gè)進(jìn)程while (ret) {i++;cout<<i<<" : " << pe32.szExeFile <<":"<<pe32.th32ProcessID << endl;//輸出進(jìn)程IDret = Process32Next(hsnap, &pe32); //查找下一個(gè)}CloseHandle(hsnap);}
運(yùn)行結(jié)果如下圖
下面詳盡地說(shuō)明,上面兩個(gè)例子出現(xiàn)的結(jié)構(gòu)體以及函數(shù)的用法。
PROCESSENTRY32結(jié)構(gòu)體
結(jié)構(gòu)體的作用:
- 用來(lái)存放快照進(jìn)程信息的一個(gè)結(jié)構(gòu)體。(存放進(jìn)程信息和調(diào)用成員輸出進(jìn)程信息)
- 用來(lái) Process32First指向第一個(gè)進(jìn)程信息,并將進(jìn)程信息抽取到PROCESSENTRY32中。用
Process32Next指向下一條進(jìn)程信息。
結(jié)構(gòu)體的聲明:
typedef struct tagPROCESSENTRY32{DWORD dwSize;DWORD cntUsage;DWORD th32ProcessID;ULONG_PTR th32DefaultHeapID;DWORD th32ModuleID;DWORD cntThreads;DWORD th32ParentProcessID;LONG pcPriClassBase;DWORD dwFlags;TCHAR szExeFile[MAX_PATH];} PROCESSENTRY32, *PPROCESSENTRY32;
參數(shù)說(shuō)明:
dwSize (結(jié)構(gòu)的大小)這個(gè)結(jié)構(gòu)的長(zhǎng)度,以字節(jié)為單位,初始化一個(gè)實(shí)例以后調(diào)用Process32First函數(shù),設(shè)置成員的大小sizeof(PROCESSENTRY32).如果你沒(méi)用PROCESSENTRY32中的成員dwSize初始化,pricess32First將會(huì)失敗。
cntUsage (此進(jìn)程的引用計(jì)數(shù))這個(gè)成員已經(jīng)很久沒(méi)有使用,總是設(shè)置為零。
th32ProcessID 進(jìn)程ID,這個(gè)就是任務(wù)管理器里面的進(jìn)程的PID,打開(kāi)任務(wù)管理器–查看—選擇列—PID(勾選)就可以顯示進(jìn)程的標(biāo)示符(PID)
th32DefaultHeapID 進(jìn)程默認(rèn)堆ID,這個(gè)成員已經(jīng)很久沒(méi)有使用,總是設(shè)置為零。
th32ModuleID 進(jìn)程模塊ID,這個(gè)成員已經(jīng)很久沒(méi)有使用,總是設(shè)置為零。
cntThreads 此進(jìn)程開(kāi)啟的線程計(jì)數(shù),這個(gè)成員執(zhí)行線程開(kāi)始的進(jìn)程。
th32ParentProcessID 父進(jìn)程的ID。
pcPriClassBase .線程優(yōu)先權(quán),當(dāng)前進(jìn)程創(chuàng)建的任何一個(gè)線程的基礎(chǔ)優(yōu)先級(jí),即在當(dāng)前進(jìn)程內(nèi)創(chuàng)建線程的話,其基本優(yōu)先級(jí)的值。
dwFlags 這個(gè)成員已經(jīng)很久沒(méi)有使用,總是設(shè)置為零。
szExeFile (一個(gè)數(shù)組)進(jìn)程全名,進(jìn)程的可執(zhí)行文件名稱。要獲得可執(zhí)行文件的完整路徑,應(yīng)調(diào)用Module32First函數(shù),再檢查其返回的MODULEENTRY32結(jié)構(gòu)的szExePath成員。但是,如果被調(diào)用進(jìn)程是一個(gè)32位程序,您必須調(diào)用QueryFullProcessImageName函數(shù)去獲取64位進(jìn)程的可執(zhí)行文件完整路徑名。
CreateToolHelp32Snapshot函數(shù)
函數(shù)作用:
列出所有進(jìn)程,需要調(diào)用CreateToolHelp32Snapshot函數(shù)先得到系統(tǒng)進(jìn)程快照的句柄,函數(shù)包含在<tlhelp32.h>頭中。
函數(shù)聲明:
HANDLE_WINAPI CreateToolHelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
參數(shù)說(shuō)明:
dwFlags:指定了獲取系統(tǒng)進(jìn)程快照的類型;
th32ProcessID:指向要獲取進(jìn)程快照的ID,獲取系統(tǒng)內(nèi)所有進(jìn)程快照時(shí)是0;
函數(shù)返回值
如果函數(shù)調(diào)用成功返回快照句柄,否則返回INVALID_HANDLE_VALUE。
Process32Next函數(shù)
函數(shù)作用:
再調(diào)用Process32Next函數(shù)列出系統(tǒng)中其它進(jìn)程
函數(shù)原型:
BOOL Process32Next(HANDLE hSnapshot,LPROCESSENTRY32 lppe);
參數(shù)說(shuō)明:
其中hSnapshot是由CreateToolHelp32Snapshot函數(shù)返回的系統(tǒng)進(jìn)程快照的句柄;
而lppe是指向PROCESSENTRY的結(jié)構(gòu)體指針,進(jìn)程的詳細(xì)信息保存在結(jié)構(gòu)體中。
OpenProcess 函數(shù)
函數(shù)作用:
OpenProcess 函數(shù)用來(lái)打開(kāi)一個(gè)已存在的進(jìn)程對(duì)象,并返回進(jìn)程的句柄。
函數(shù)原型:
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
參數(shù)說(shuō)明:
1.dwDesiredAccess:想擁有的該 進(jìn)程訪問(wèn)權(quán)限
PROCESS_ALL_ACCESS //所有能獲得的權(quán)限
PROCESS_CREATE_PROCESS //需要?jiǎng)?chuàng)建一個(gè)進(jìn)程
PROCESS_CREATE_THREAD //需要?jiǎng)?chuàng)建一個(gè)線程
PROCESS_DUP_HANDLE //重復(fù)使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //獲得進(jìn)程信息的權(quán)限,如它的退出代碼、優(yōu)先級(jí)
PROCESS_QUERY_LIMITED_INFORMATION /獲得某些信息的權(quán)限,如果獲得了PROCESS_QUERY_INFORMATION,也擁有PROCESS_QUERY_LIMITED_INFORMATION權(quán)限/
PROCESS_SET_INFORMATION //設(shè)置某些信息的權(quán)限,如進(jìn)程優(yōu)先級(jí)
PROCESS_SET_QUOTA //設(shè)置內(nèi)存限制的權(quán)限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暫?;蚧謴?fù)進(jìn)程的權(quán)限
PROCESS_TERMINATE //終止一個(gè)進(jìn)程的權(quán)限,使用TerminateProcess
PROCESS_VM_OPERATION //操作進(jìn)程內(nèi)存空間的權(quán)限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //讀取進(jìn)程內(nèi)存空間的權(quán)限,可使用ReadProcessMemory
PROCESS_VM_WRITE //讀取進(jìn)程內(nèi)存空間的權(quán)限,可使用WriteProcessMemory
SYNCHRONIZE //等待進(jìn)程終止
2.bInheritHandle:表示所得到的進(jìn)程句柄是否可以被繼承
3.dwProcessId:被打開(kāi)進(jìn)程的PID
返回說(shuō)明:
如成功,返回值為指定進(jìn)程的句柄。
如失敗,返回值為NULL,可調(diào)用GetLastError()獲得錯(cuò)誤代碼。
TerminateProcess函數(shù)
函數(shù)作用:
個(gè)函數(shù)可以用來(lái)終止或者說(shuō)殺死一個(gè)進(jìn)程,它不會(huì)留給進(jìn)程及其所有線程清理的時(shí)間,系統(tǒng)會(huì)馬上終止(殺死)這個(gè)進(jìn)程的所有線程,致使進(jìn)程終止。在使用此函數(shù)前我們必須要調(diào)用OpenProcess函數(shù)來(lái)獲得我們要終止(殺死)進(jìn)程的句柄,并且要獲得進(jìn)程的PROCESS_TERMINATE權(quán)限。
函數(shù)原型:
BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode)
參數(shù)說(shuō)明:
1、hProcess:要終止(殺死)進(jìn)程的句柄,需要有PROCESS_TERMINATE權(quán)限。
2、uExitCode:設(shè)置進(jìn)程的退出值??赏ㄟ^(guò)GetExitCodeProcess函數(shù)得到一個(gè)進(jìn)程的退出值。
返回值說(shuō)明:
如果失敗將返回FALSE(0),而成功將返回一個(gè)非零值。
注:不要用if(ret==TRUE)去檢測(cè)函數(shù)是否調(diào)用成功,因?yàn)楹瘮?shù)調(diào)用成功會(huì)返回一個(gè)非零值,但不一定是TRUE(1)
CloseHandle函數(shù)
函數(shù)原型:
BOOL CloseHandle(HANDLE hObject);
參數(shù)說(shuō)明:
hObject :代表一個(gè)已打開(kāi)對(duì)象handle。
返回值說(shuō)明:
TRUE:執(zhí)行成功;
FALSE:執(zhí)行失敗,可以調(diào)用GetLastError()獲知失敗原因。
函數(shù)說(shuō)明:
關(guān)閉一個(gè)內(nèi)核對(duì)象。其中包括文件、文件映射、進(jìn)程、線程、安全和同步對(duì)象等。在CreateThread成功之后會(huì)返回一個(gè)hThread的handle,且內(nèi)核對(duì)象的計(jì)數(shù)加1,CloseHandle之后,引用計(jì)數(shù)減1,當(dāng)變?yōu)?時(shí),系統(tǒng)刪除內(nèi)核對(duì)象。
若在線程執(zhí)行完之后,沒(méi)有調(diào)用CloseHandle,在進(jìn)程執(zhí)行期間,將會(huì)造成內(nèi)核對(duì)象的泄露,相當(dāng)于句柄泄露,但不同于內(nèi)存泄露,這勢(shì)必會(huì)對(duì)系統(tǒng)的效率帶來(lái)一定程度上的負(fù)面影響。但當(dāng)進(jìn)程結(jié)束退出后,系統(tǒng)會(huì)自動(dòng)清理這些資源。