繼寫完上篇<進程初探之終結>文章,我有很長時間沒有來管理我博客中的閑言片斷了。五一,公司放了三天假,原計劃在此期間去公園散散步,拿本書在大樹下的石凳上坐上半天,累了休息一下,欲在這喧囂都市中尋找心中的那份寧靜。再花一天時間去植物園中觀賞游玩一趟,讓滿眼的綠意來驅趕滿腦子的項目需求設計,讓這重負的腦袋斷電休息一天。然這幾天老天不作美,卻陰著臉,下起雨來了。看來計劃又得落空。
時下很多介紹人際交往、公關之類的書藉。大凡其中都談到了要因人而異,了解對方。然后才能展開有效的交際方法。是的,比如說有些人就喜歡與少言之人做朋友,而有些人卻喜歡與能言者做朋友。有的人喜歡談政治,有的人喜歡談利益。你如果與剛愎自用之人談與其相悖的觀點,我估計會鬧個不歡而散,而與虛懷若谷的納言人則可能會視你為良友。同一番話給與不同的人,就產生了截然不同的效果,所以我們要有因人而異的交際策略。這也就提出了要我們在想好這個策略之前就要了解一個人。進程之間也會是如此的嗎?
上面說了這么多的引言,下面來說一進程的發現,認識。下面用一段代碼示例枚舉了當前系統中的進程。
1
#ifndefine _XIAO_TOOLHELP_H_
2
#define _XIAO_TOOLHELP_H_
3
#include <TLHELP32.H>
4
#include <tchar.h>
5
/**/////////////////////////////////////////////////////////////// 6
7
class CToolHelp
8

{
9
public:
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
3
CToolHelp::CToolHelp(DWORD dwFlags,DWORD dwProcessId)
4

{
5
m_hSnapshot=INVALID_HANDLE_VALUE;
6
CreateSnapshot(dwFlags,dwProcessId);
7
}
8
9
/**///////////////////////////////////////////////////////////////////////////////10
11
CToolHelp::~CToolHelp()
12

{
13
if(m_hSnapshot != INVALID_HANDLE_VALUE)
14
{
15
CloseHandle(m_hSnapshot);
16
}
17
}
18
19
/**///////////////////////////////////////////////////////////////////////////////20
21
BOOL 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
40
BOOL 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
52
BOOL 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
64
BOOL 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);
當然還可枚舉其它的內核對象。
好了系統進程的枚舉暫且就回憶到這里。