论文部分内容阅读
[摘要]讨论使用Windows工具库API函数CreateToolhelp32Snapshot对系统进程进行枚举的基本方法。以VC++6.0为开发平台实现了一个进程查看和结束程序。
[关键词]进程 枚举 VC++ MFC
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)0920055-01
一、进程枚举就一些基本概念
(一)进程
进程就是应用程序的运行实例,是应用程序的一次动态执行。
(二)进程枚举
进程枚举就是通过一定的方法获得当前系统运行的所有进程的ID,进而根据进程ID获得和进程相关的其他信息,比如进程的CPU和内存占用率、进程加载的DLL模块、进程所创建的线程数和进程所对应的映像名称等等。
二、使用工具库API函数进行进程枚举
使用工具库API函数进行进程枚举是一种最常用的进程枚举方法。它主要用到以下几个API函数:CreateToolhelp32Snapshot、Process32First、
Process32Next。
(一)主要相关API函数
API函数CreateToolhelp32Snapshot的功能就是给系统拍快照。它的原型如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID),其中参数dwFlags指定了快照中包合的内容。它的值常选为TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCES
S、TH32CS_SNAPTHREAD中的一个,这四个值的含意分别为给指定进程的堆、指定进程的模块(通常为DLL)、和当前进程、指定进程的线程拍快照。参数th32ProcessID为进程ID。
Process32First和Process32Next的原型分别为BOOL WINAPI Process
32First(HANDLEhSnapshot,LPROCESSENTRY32lpte)和BOOL WINAPI Process32Next( HANDLE hSnapshot, LPROCESSENTRY32 lpte)。这两个API函数的作用分别获得当前进程快照中的第一个和下一个进程。参数hSnapshot为调用CreateToolhelp32Snapshot函数时返回的句柄,参数lpte是结构体PROCESSENTRY32的指针变量。结构体PROCESSENTRY32是用来接收函数Process32First和Process32Next所枚举到的进程的一些信息的。
(二)进程关闭
关闭进程先对系统当前运行的进程进行枚举,根据一定的选择条件在函数Process32Next的参数中的结构体PROCESSENTRY32的变量的元素th32ProcessID获得要关闭的进程的ID号。再调用函数OpenProcess(PROCES
S_TERMINATE,TRUE,m_pIdSelected),该函数返回指定进程ID的进程的句柄。再将得到的进程句柄传递给函数TerminateProcess,关闭指定的进程。
三、枚举和关闭进程程序示例
下面实现一个基于MFC对话框的枚举和关闭进程的应用程序:
创建工程,首先在主对话框模板中加入一个ID为IDC_LIST1列表视控件并设置它为报告样式。再增加两个分别为刷新和结束进程的按钮,它们的ID分别为:IDC_FRESH和IDC_TERMINATE。
为列表框控件绑定一个成员CListCtrl类现的成员变量m_processCtrl。在对话框中的初始化函数OnInitDialog中加入如下代码,为列表视控件加入表头:
m_processCtrl.InsertColumn(0,"进程ID",LVCFMT_LEFT,50);//为列表视加入标题
m_processCtrl.InsertColumn(1,"进程名",LVCFMT_LEFT,100);
m_processCtrl.InsertColumn(2,"线程数",LVCFMT_LEFT,50);
再增加对当前进程进行枚举的代码,核心代码如下:
HANDLE hSnapShot
=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32* processInfo=new PROCESSENTRY32;
processInfo->dwSize=sizeof(PROCESSENTRY32);
int index=0;
char buff[10];
while(Process32Next(hSnapShot,processInfo)!=FALSE)
{ //枚举进程并将枚举结果加入到列表视中 m_processCtrl.
InsertItem(index,itoa(processInfo->th32ProcessID,buff,10));
m_processCtrl.SetItemText(index,1,processInfo->szExeFile );
m_processCtrl.SetItemText(index,2,itoa(processInfo->cntThreads,buff,8) );
index++;
}
对于刷新按钮执行和初始化对话框相同的代码。但不能包含前三句,以免每次刷新都为列表视空间加上重复的表头列。
再为结束进程按钮加上如下代码:
HANDLE hProcess
=OpenProcess(PROCESS_TERMINATE,TRUE,m_pIdSelected);
if(hProcess==NULL)
{
MessageBox("读取进程失败!","结束进程");
OnFresh();
return;
}
if(!TerminateProcess(hProcess,0))
{
Return;
}
OnFresh();
其中变量m_pIdSelected;为给主对话框类填加的用来标识当前选中项所对应的进程的ID。它的值是在每次列表视控件的选项变更的时候修改的。所以还应为列表视控件填加如下所示的对消息LVN_ITEMCHANGED的处理代码:
char buff[10];
itoa(pNMListView->iItem,buff,10);
CString pIdSelected=m_processCtrl.GetItemText(pNMListView->iItem,0);
m_pIdSelected=atoi((const char *)pIdSelected);
GetDlgItem(IDC_TERMINATE)->EnableWindow(TRUE);
参考文献:
[1]Jeffrey RichterProgramming Applications for Microsoft Windows,机械工业出版社.
[2]黄维通,Visual C++面向对象与可视化程序设计,第二版,清华大学出版社.
[3]孙鑫、余安萍,VC++深入深入详解,第一版,电子工业出版社.
[关键词]进程 枚举 VC++ MFC
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)0920055-01
一、进程枚举就一些基本概念
(一)进程
进程就是应用程序的运行实例,是应用程序的一次动态执行。
(二)进程枚举
进程枚举就是通过一定的方法获得当前系统运行的所有进程的ID,进而根据进程ID获得和进程相关的其他信息,比如进程的CPU和内存占用率、进程加载的DLL模块、进程所创建的线程数和进程所对应的映像名称等等。
二、使用工具库API函数进行进程枚举
使用工具库API函数进行进程枚举是一种最常用的进程枚举方法。它主要用到以下几个API函数:CreateToolhelp32Snapshot、Process32First、
Process32Next。
(一)主要相关API函数
API函数CreateToolhelp32Snapshot的功能就是给系统拍快照。它的原型如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID),其中参数dwFlags指定了快照中包合的内容。它的值常选为TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCES
S、TH32CS_SNAPTHREAD中的一个,这四个值的含意分别为给指定进程的堆、指定进程的模块(通常为DLL)、和当前进程、指定进程的线程拍快照。参数th32ProcessID为进程ID。
Process32First和Process32Next的原型分别为BOOL WINAPI Process
32First(HANDLEhSnapshot,LPROCESSENTRY32lpte)和BOOL WINAPI Process32Next( HANDLE hSnapshot, LPROCESSENTRY32 lpte)。这两个API函数的作用分别获得当前进程快照中的第一个和下一个进程。参数hSnapshot为调用CreateToolhelp32Snapshot函数时返回的句柄,参数lpte是结构体PROCESSENTRY32的指针变量。结构体PROCESSENTRY32是用来接收函数Process32First和Process32Next所枚举到的进程的一些信息的。
(二)进程关闭
关闭进程先对系统当前运行的进程进行枚举,根据一定的选择条件在函数Process32Next的参数中的结构体PROCESSENTRY32的变量的元素th32ProcessID获得要关闭的进程的ID号。再调用函数OpenProcess(PROCES
S_TERMINATE,TRUE,m_pIdSelected),该函数返回指定进程ID的进程的句柄。再将得到的进程句柄传递给函数TerminateProcess,关闭指定的进程。
三、枚举和关闭进程程序示例
下面实现一个基于MFC对话框的枚举和关闭进程的应用程序:
创建工程,首先在主对话框模板中加入一个ID为IDC_LIST1列表视控件并设置它为报告样式。再增加两个分别为刷新和结束进程的按钮,它们的ID分别为:IDC_FRESH和IDC_TERMINATE。
为列表框控件绑定一个成员CListCtrl类现的成员变量m_processCtrl。在对话框中的初始化函数OnInitDialog中加入如下代码,为列表视控件加入表头:
m_processCtrl.InsertColumn(0,"进程ID",LVCFMT_LEFT,50);//为列表视加入标题
m_processCtrl.InsertColumn(1,"进程名",LVCFMT_LEFT,100);
m_processCtrl.InsertColumn(2,"线程数",LVCFMT_LEFT,50);
再增加对当前进程进行枚举的代码,核心代码如下:
HANDLE hSnapShot
=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32* processInfo=new PROCESSENTRY32;
processInfo->dwSize=sizeof(PROCESSENTRY32);
int index=0;
char buff[10];
while(Process32Next(hSnapShot,processInfo)!=FALSE)
{ //枚举进程并将枚举结果加入到列表视中 m_processCtrl.
InsertItem(index,itoa(processInfo->th32ProcessID,buff,10));
m_processCtrl.SetItemText(index,1,processInfo->szExeFile );
m_processCtrl.SetItemText(index,2,itoa(processInfo->cntThreads,buff,8) );
index++;
}
对于刷新按钮执行和初始化对话框相同的代码。但不能包含前三句,以免每次刷新都为列表视空间加上重复的表头列。
再为结束进程按钮加上如下代码:
HANDLE hProcess
=OpenProcess(PROCESS_TERMINATE,TRUE,m_pIdSelected);
if(hProcess==NULL)
{
MessageBox("读取进程失败!","结束进程");
OnFresh();
return;
}
if(!TerminateProcess(hProcess,0))
{
Return;
}
OnFresh();
其中变量m_pIdSelected;为给主对话框类填加的用来标识当前选中项所对应的进程的ID。它的值是在每次列表视控件的选项变更的时候修改的。所以还应为列表视控件填加如下所示的对消息LVN_ITEMCHANGED的处理代码:
char buff[10];
itoa(pNMListView->iItem,buff,10);
CString pIdSelected=m_processCtrl.GetItemText(pNMListView->iItem,0);
m_pIdSelected=atoi((const char *)pIdSelected);
GetDlgItem(IDC_TERMINATE)->EnableWindow(TRUE);
参考文献:
[1]Jeffrey RichterProgramming Applications for Microsoft Windows,机械工业出版社.
[2]黄维通,Visual C++面向对象与可视化程序设计,第二版,清华大学出版社.
[3]孙鑫、余安萍,VC++深入深入详解,第一版,电子工业出版社.