得到95和NT中正在運行的進程
發表于:2007-07-14來源:作者:點擊數:
標簽:
賈旭濱(譯) 有些時候,我們在運行一些程序的時候,需要得到當前系統中所有的進程的列表。當然,這對于一個比較熟悉計算機的人來說,很簡單,在WINNT中我們可以使用任務管理器來知道,在WIN95/98/ME中我們可以使用一些工具來知道就可以了。不過我們現在要寫一
賈旭濱(譯)
有些時候,我們在運行一些程序的時候,需要得到當前系統中所有的進程的列表。當然,這對于一個比較熟悉計算機的人來說,很簡單,在WINNT中我們可以使用任務管理器來知道,在WIN95/98/ME中我們可以使用一些工具來知道就可以了。不過我們現在要寫一個既能在NT中運行,又能在95/98/ME中運行的程序,它能得到進程的列表,而又不必要一些麻煩的操作。因此,我寫了一個C++類,它使用Win32Process來得到當前系統中所有運行的進程,當然肯定是用MFC寫的,而且這個程序在NT和95/98/ME中都能運行,這就是我在這兒提出來的原因。這個程序能得知系統的類型,并且選擇要運行程序的哪部分,進行什么操作。
該類的代碼是這樣寫的(代碼可到“程序代碼”
下載),它使用了DLL,函數都是動態加載的,所以你不必要去連接一個LIB文件,而使得你的代碼(或者是你的工程設置)在NT和98/95/ME中需要不同的的寫法(需要不同的設置)。比如,我們在NT上編譯,但是我們需要使用WIN95中的TOOLHELP函數Process32Next(),即使這樣,編譯、連接和運行卻都能進行。因此,我們要做的就是把代碼加到你工程中去,然后你就能高枕無憂的運行就行了,因為類回自動選擇該用什么。
使用步驟:
1.要使用這個類,首先得把它的頭文件加到我們要用的地方。
2.然后聲明變量,比如:Win32Process m_win32proc。
3.在使用之前還應該初始化它,代碼如下:
if(!m_win32proc.Init())
AfxMessageBox(m_win32proc.GetLastError());
如果你是在95上初始的,就能得到需要的函數的指針。如果是在NT上的,該函數什么事都不干,但是它還是會被調用的。運行成功的話就返回TRUE值,失敗則是FALSE,如果要想得到是什么錯誤的話,可以調用GetLastError(),它能返回一個關于錯誤屬性的字符串。如下,就可以得到進程的列表了:
if (!m_win32proc.EnumAllProcesses())
{
AfxMessageBox(m_win32proc.GetLastError());
return;
}
好了!在Win32Process.cpp中有一個CStringArray數組,它列出了所有當前運行的進程的名字。要想顯示進程的名字的話,還要做一些事情,我們可以用列表框來顯示,如下:
int size=m_win32proc.GetAllProcessesNames()->GetSize();
for (int i=0;i m_ctrlProcLB.AddString(m_win32proc.GetAllProcessesNames()->GetAt(i));
這兒m_ctrlProcLB是一個LIST BOX控件。很簡單吧?如果你還想知道具體的哪個進程是不是在運行的時候,你可以用GetProcessStatus()函數,如下:
if (!m_win32proc.GetProcessStatus(&m_strProcessToCheck,&bStatus))
{
AfxMessageBox(m_win32proc.GetLastError());
return;
}
if (bStatus)
AfxMessageBox(m_strProcessToCheck+" is running!");
else
AfxMessageBox(m_strProcessToCheck+" is NOT running!");
不過很可惜,GetProcessStatus()不會返回一個BOOL值來顯示那個進程是不是在運行,不過這也沒有事,我們可以定義一個變量來表示就行了。這兒是已經封裝的類,可供下載(還是有DEMO程序的)。
原文轉自:http://www.anti-gravitydesign.com