列舉程式 (轉)

worldblog發表於2007-12-14
列舉程式 (轉)[@more@]

列舉程式:一個實踐的方法
作者:Irfan Dawood
來源:">
譯者:zhf0021

簡介
  首先,歡迎來到“列舉程式:一個實踐的方法”這個旅程。在這裡,我將試著定義什麼是程式,然後我們將用C++和ToolHelp32 找出我們機器上正在執行的所有程式。

什麼是程式
  程式是正在執行的的一個例項。中,可能一個程式有多個執行的例項,他們各自獨立的執行著。一個程式能夠產生子程式,產生子程式的程式也叫父程式。這和麵向中的繼承不相同,物件導向中,我們可以在不產生父類的例項的情況下產生子類的例項。而要產生子程式必須首先產生父程式,同時,子程式可以使用父程式的資源。

解釋
  我使用的是Visual C++ 6.0 專業版,工程型別是 Console Application(為了簡單),我們將使用ToolHelp32 API。我使用的是,希望在9x上也能執行。對NT而言,我們使用PSAPI (Process Status API),在這裡我們將不討論他們。

  首先要包含必要的頭:
  #include <.h>
  #include
 #include  
 #include

 using namespace std;

 int main( )
 {
    cout< 
  現在我們將利用函式CreateToolhelp32Snapshot()獲得當前執行程式的快照,這個函式返回包含正在執行

程式的快照控制程式碼。他的原形是:
  HANDLE WINAPI CreateToolhelp32Snapshot(
  D dwFlags, 
  DWORD th32ProcessID
  );
  我們將dwFlags設為TH32CS_SNAPPROCESS,th32ProcessID置為0。其他選項參見MSDN。

  HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

  現在我們獲得了所有程式的資訊。我們將從hSnapShot中抽取資料到一個PROCESSENTRY32結構中,這個結構

代表了一個程式,是ToolHelp32 API的一部分。抽取資料靠Process32First()和Process32Next()這兩個函式。

這裡我們僅用Process32Next(),他的原形是:
  BOOL WINAPI Process32Next(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
  );
  我們程式的程式碼中加入:

  PROCESSENTRY32* processInfo=new PROCESSENTRY32;

  必須設定PROCESSENTRY32的dwSize成員的值 ;

  processInfo->dwSize=sizeof(PROCESSENTRY32);
  int index=0;

  這裡我們將快照控制程式碼和PROCESSENTRY32結構傳給Process32Next()。之後,PROCESSENTRY32 結構將獲

得程式的資訊。我們迴圈遍歷,直到函式返回FALSE。

  while(Process32Next(hSnapShot,processInfo)!=FALSE)
 {
 cout< cout< cout< cout<th32ParentProcessID;
 cout<th32ProcessID;
 cout<szExeFile;
 cout<cntThreads;
 cout<cntUsage;
 cout<dwFlags; 
 cout<dwSize;
 cout<pcPriClassBase;
 cout<th32DefaultHeapID; 
 cout<th32ModuleID;
 }

  不要忘記關閉控制程式碼:

  CloseHandle(hSnapShot);
  cout<  cout<  cout<

  現在我們獲得了所有正在執行程式的資訊,包括程式ID(非常重要),檔名,父程式ID等等。我們可以

用函式OpenProcess()獲得程式ID。
  HANDLE OpenProcess(
  DWORD dwDesiredAccess,  // access flag
  BOOL bInheritHandle,  // handle inheritance option
  DWORD dwProcessId  // process ntifier
  );
  詳細描述見MSDN。

  int processID;
  cout<  cin>>processID;

  這裡我們用PROCESS_ALL_ACCESS
  HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);
  if(hProcess==NULL)
  {
  cout<  cout<  return 1;
  }
  現在我們有程式的控制程式碼,就可以做魔術般的事情了!我們先透過函式GetPriorityClass() 獲得程式的有優

先級,然後透過SetPriorityClass()設定優先順序:

  cout<  SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS);
  CloseHandle(hProcess);

  現在我們用函式 TenateProcess()終止程式:

  cout<  cin>>processID;
  hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);
  if(hProcess==NULL)
  {
  cout<  cout<  }
  TerminateProcess(hProcess,0);

  當我們在堆中透過new運算子建立物件後,必須顯式的透過delete刪除之。
  delete processInfo;
  return 0;
}


 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993280/,如需轉載,請註明出處,否則將追究法律責任。

相關文章