|
9.1.4 终止指定进程的技巧
1.问题阐述
终止进程也就是结束进程,让进程从内存中卸载。进程的终止的原因一般有4种。 主线程的入口函数返回。 进程中的一个线程调用ExitProcess函数。 次进程中的所有线程结束。 其他进程中又有线程都结束。
2.实现技巧
函数Process32First()和函数Process32Next()能够枚举系统中的所有进程,函数SHGetFileInfo()能够获得进程的信息,一旦得到进程的标识号,就可以对进程进行终止。由于被管理进程在当前进程之外,因此进程首先通过OpenProcess()函数来获取一个已经存在的进程对象的句柄,然后才可以通过该句柄对指定的进程进行管理和控制。OpenProcess()函数的声明如下:
HANDLE WINAPI OpenProcess( DWORD dwDesiredAccess, //访问标志 BOOL bInheritHandle, //处理进程标志 DWORD dwProcessId //进程标志号 );
| 3.实例代码
#include <tlhelp32.h> void CTestView::OnRButtonDown(UINT nFlags, CPoint point) { int nProcess =0; HANDLE snapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ; if(snapshot == NULL) return ; SHFILEINFO shSmall; PROCESSENTRY32 processinfo ; processinfo.dwSize=sizeof(processinfo) ; BOOL status=Process32First(snapshot,&processinfo) ; while (status) { ZeroMemory(&shSmall, sizeof(shSmall)); SHGetFileInfo(processinfo.szExeFile,0,&shSmall,sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON); CString StrInfo="是否需要终止进程:"; StrInfo+=processinfo.szExeFile; if(AfxMessageBox(StrInfo,MB_YESNO)==IDYES) { DWORD dwProcessID=processinfo.th32ProcessID; HANDLE hProcess=::OpenProcess(PROCESS_TERMINATE,FALSE, dwProcessID); ::TerminateProcess(hProcess,0); CloseHandle(hProcess); } status = Process32Next (snapshot, &processinfo) ; nProcess++; } CView::OnRButtonDown(nFlags, point); }
|
4.小结
进程结束后,调用GetExitCodeProcess函数可以得到其退出代码,如果在调用这个函数时,目标进程还没有结束,此函数会返回STILL_ACTIVE,表示进程还在运行。
【责任编辑: 夏书 TEL:(010)68476606】
|