继写完上篇<进程初探之终结>文章,我有很长时间没有来管理我博客中的闲言片断了。五一,公司放了三天假,原计划在此期间去公园散散步,拿本书在大树下的石凳上坐上半天,累了休息一下,欲在这喧嚣都市中寻找心中的那份宁静。再花一天时间去植物园中观赏游玩一趟,让满眼的绿意来驱赶满脑子的项目需求设计,让这重负的脑袋断电休息一天。然这几天老天不作美,却阴着脸,下起雨来了。看来计划又得落空。
时下很多介绍人际交往、公关之类的书藉。大凡其中都谈到了要因人而异,了解对方。然后才能展开有效的交际方法。是的,比如说有些人就喜欢与少言之人做朋友,而有些人却喜欢与能言者做朋友。有的人喜欢谈政治,有的人喜欢谈利益。你如果与刚愎自用之人谈与其相悖的观点,我估计会闹个不欢而散,而与虚怀若谷的纳言人则可能会视你为良友。同一番话给与不同的人,就产生了截然不同的效果,所以我们要有因人而异的交际策略。这也就提出了要我们在想好这个策略之前就要了解一个人。进程之间也会是如此的吗?
上面说了这么多的引言,下面来说一进程的发现,认识。下面用一段代码示例枚举了当前系统中的进程。
1#ifndefine _XIAO_TOOLHELP_H_
2#define _XIAO_TOOLHELP_H_
3#include <TLHELP32.H>
4#include <tchar.h>
5/**/////////////////////////////////////////////////////////////// 6
7class CToolHelp
8{
9public:
10 CToolHelp(DWORD dwFlags = 0,DWORD dwProcessId = 0);
11 ~CToolHelp();
12
13 BOOL CreateSnapshot(DWORD dwFlags,DWORD dwProcessId = 0);
14
15 BOOL ProcessFirst(PPROCESSENTRY32 ppe);
16 BOOL ProcessNext(PPROCESSENTRY32 ppe);
17 BOOL ProcessFind(DWORD dwProcessId,PPROCESSENTRY32 ppe) ;
18};
19#endif
20
cpp实现文件如下
1/**//////////////////////////////////////////////////////////////////////////////// 2
3CToolHelp::CToolHelp(DWORD dwFlags,DWORD dwProcessId)
4{
5 m_hSnapshot=INVALID_HANDLE_VALUE;
6 CreateSnapshot(dwFlags,dwProcessId);
7}
8
9/**///////////////////////////////////////////////////////////////////////////////10
11CToolHelp::~CToolHelp()
12{
13 if(m_hSnapshot != INVALID_HANDLE_VALUE)
14 {
15 CloseHandle(m_hSnapshot);
16 }
17}
18
19/**///////////////////////////////////////////////////////////////////////////////20
21BOOL CToolHelp::CreateSnapshot(DWORD dwFlags,DWORD dwProcessId)
22{
23 if(m_hSnapshot != INVALID_HANDLE_VALUE)
24 {
25 CloseHandle(m_hSnapshot);
26 }
27 if(dwFlags == 0)
28 {
29 m_hSnapshot = INVALID_HANDLE_VALUE;
30 }
31 else
32 {
33 m_hSnapshot = CreateToolhelp32Snapshot(dwFlags,dwProcessId);
34 }
35 return m_hSnapshot != INVALID_HANDLE_VALUE;
36}
37
38/**/////////////////////////////////////////////////////////////////////////////39
40BOOL CToolHelp::ProcessFirst(PPROCESSENTRY32 ppe)
41{
42 BOOL fOk = Process32First(m_hSnapshot,ppe);
43 if (fOk && (ppe->th32ParentProcessID==0))
44 {
45 fOk = ProcessNext(ppe);
46 }
47 return fOk;
48}
49
50/**/////////////////////////////////////////////////////////////////////////////51
52BOOL CToolHelp::ProcessNext(PPROCESSENTRY32 ppe)
53{
54 BOOL fOk = Process32Next(m_hSnapshot,ppe);
55 if (fOk && (ppe->th32ParentProcessID==0))
56 {
57 fOk = ProcessNext(ppe);
58 }
59 return fOk;
60}
61
62/**///////////////////////////////////////////////////////////////////////////////63
64BOOL CToolHelp::ProcessFind(DWORD dwProcessId,PPROCESSENTRY32 ppe)
65{
66 BOOL fFound = FALSE;
67 for(BOOL fOk=ProcessFirst(ppe); fOk ;fOk = ProcessNext(ppe))
68 {
69 fFound = (ppe->th32ProcessID == dwProcessId);
70 if(fFound)
71 {
72 break;
73 }
74 }
75 return TRUE;
76}
声明:上面的代码的构思及实现都是Jeffrey这位顶级大牛的一些片断代码。
进程是系统的内核对象,内核对象就是仅有系统内核管理的一块内存数据结构。从这段内核对象的代码里我们可以看出内核对象为系统内核所专有访问权,也说明了内核对象在系统中存有其数信息。为此上面就用了这个函数
HANDLE m_hSnapshot = CreateToolhelp32Snapshot(dwFlgs,dwProcessId);
来建立一份系统的快照。对于这个函数的两个参数,前一个是指明将立快照的类型,后一个是指明是否针对某一个特殊的进程ID的快照。在我们有了系统的快照之后。我们将用下面的两个函数来浏览快照中的进程信息。
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL Process32First(m_hSnapshot,&pe);
BOOL Process32Next(m_hSnapshot,&pe);
对于上述要注明一点的是pe结构必须初始化,否则将不会成功。这样数来要实现系统进程的枚举也就这么几个函数了。上面这种实现方法在win95 ,win98,win2000,winxp,及win2003中都能够这样。
上面介绍了通用的一种方法,下面再介绍一种不能在win95,win98中的枚举方法,这原因还得从MS的windows NT开发小组说起,他们更中意下面的枚举方法。
利用psapi.dll中提供的函数来实现进程等内核对象的枚举。
BOOL EnumProcesses(DWORD *pdwProcess,DWORD cb,DWORD cbNeeded);
当然还可枚举其它的内核对象。
好了系统进程的枚举暂且就回忆到这里。