繼寫完上篇<進(jìn)程初探之終結(jié)>文章,我有很長時間沒有來管理我博客中的閑言片斷了。五一,公司放了三天假,原計劃在此期間去公園散散步,拿本書在大樹下的石凳上坐上半天,累了休息一下,欲在這喧囂都市中尋找心中的那份寧靜。再花一天時間去植物園中觀賞游玩一趟,讓滿眼的綠意來驅(qū)趕滿腦子的項目需求設(shè)計,讓這重負(fù)的腦袋斷電休息一天。然這幾天老天不作美,卻陰著臉,下起雨來了。看來計劃又得落空。
時下很多介紹人際交往、公關(guān)之類的書藉。大凡其中都談到了要因人而異,了解對方。然后才能展開有效的交際方法。是的,比如說有些人就喜歡與少言之人做朋友,而有些人卻喜歡與能言者做朋友。有的人喜歡談?wù)危械娜讼矚g談利益。你如果與剛愎自用之人談與其相悖的觀點,我估計會鬧個不歡而散,而與虛懷若谷的納言人則可能會視你為良友。同一番話給與不同的人,就產(chǎn)生了截然不同的效果,所以我們要有因人而異的交際策略。這也就提出了要我們在想好這個策略之前就要了解一個人。進(jìn)程之間也會是如此的嗎?
上面說了這么多的引言,下面來說一進(jìn)程的發(fā)現(xiàn),認(rèn)識。下面用一段代碼示例枚舉了當(dāng)前系統(tǒng)中的進(jìn)程。
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實現(xiàn)文件如下
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
}
聲明:上面的代碼的構(gòu)思及實現(xiàn)都是Jeffrey這位頂級大牛的一些片斷代碼。
進(jìn)程是系統(tǒng)的內(nèi)核對象,內(nèi)核對象就是僅有系統(tǒng)內(nèi)核管理的一塊內(nèi)存數(shù)據(jù)結(jié)構(gòu)。從這段內(nèi)核對象的代碼里我們可以看出內(nèi)核對象為系統(tǒng)內(nèi)核所專有訪問權(quán),也說明了內(nèi)核對象在系統(tǒng)中存有其數(shù)信息。為此上面就用了這個函數(shù)
HANDLE m_hSnapshot = CreateToolhelp32Snapshot(dwFlgs,dwProcessId);
來建立一份系統(tǒng)的快照。對于這個函數(shù)的兩個參數(shù),前一個是指明將立快照的類型,后一個是指明是否針對某一個特殊的進(jìn)程ID的快照。在我們有了系統(tǒng)的快照之后。我們將用下面的兩個函數(shù)來瀏覽快照中的進(jìn)程信息。
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL Process32First(m_hSnapshot,&pe);
BOOL Process32Next(m_hSnapshot,&pe);
對于上述要注明一點的是pe結(jié)構(gòu)必須初始化,否則將不會成功。這樣數(shù)來要實現(xiàn)系統(tǒng)進(jìn)程的枚舉也就這么幾個函數(shù)了。上面這種實現(xiàn)方法在win95 ,win98,win2000,winxp,及win2003中都能夠這樣。
上面介紹了通用的一種方法,下面再介紹一種不能在win95,win98中的枚舉方法,這原因還得從MS的windows NT開發(fā)小組說起,他們更中意下面的枚舉方法。
利用psapi.dll中提供的函數(shù)來實現(xiàn)進(jìn)程等內(nèi)核對象的枚舉。
BOOL EnumProcesses(DWORD *pdwProcess,DWORD cb,DWORD cbNeeded);
當(dāng)然還可枚舉其它的內(nèi)核對象。
好了系統(tǒng)進(jìn)程的枚舉暫且就回憶到這里。