9.1.4 终止指定进程的技巧

2013-10-07 00:13:59 · 作者: · 浏览: 58

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】

回书目   上一节   下一节