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