列舉程式 (轉)
列舉程式:一個實踐的方法
作者: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<
cout<
cout<
cout<
cout<
cout<
cout<
}
不要忘記關閉控制程式碼:
CloseHandle(hSnapShot); 現在我們獲得了所有正在執行程式的資訊,包括程式ID(非常重要),檔名,父程式ID等等。我們可以 用函式OpenProcess()獲得程式ID。 int processID; 這裡我們用PROCESS_ALL_ACCESS 先級,然後透過SetPriorityClass()設定優先順序: cout< 現在我們用函式 TenateProcess()終止程式: cout< 當我們在堆中透過new運算子建立物件後,必須顯式的透過delete刪除之。
cout<
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process ntifier
);
詳細描述見MSDN。
cout< cin>>processID;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);
if(hProcess==NULL)
{
cout< cout< return 1;
}
現在我們有程式的控制程式碼,就可以做魔術般的事情了!我們先透過函式GetPriorityClass() 獲得程式的有優
CloseHandle(hProcess);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);
if(hProcess==NULL)
{
cout< cout< }
TerminateProcess(hProcess,0);
delete processInfo;
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993280/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 選單列舉記 (轉)
- c#列舉轉換C#
- c++11 實現列舉值到列舉名的轉換C++
- 屬性列舉法(轉載)
- dedecms聯動型別裡,知道列舉值,如何轉換為列舉名型別
- C# 列舉遍歷和轉換C#
- 【轉】Java 列舉7常見種用法Java
- 再談在Java中使用列舉(轉)Java
- Java列舉Java
- Swift,列舉Swift
- 重走JAVA程式設計之路(一)列舉Java程式設計
- 2、全域性變數和列舉常量 (轉)變數
- C# 列舉與位列舉概述C#
- 7.4 透過API列舉程式許可權API
- 7.1 實現程式記憶體塊列舉記憶體
- 列舉工具類
- TypeScript 列舉enumTypeScript
- Java 列舉(enum)Java
- Swift-列舉Swift
- 自定義列舉
- java列舉類Java
- TypeScript 列舉指南TypeScript
- Java列舉使用Java
- C#:列舉C#
- 列舉型別型別
- 轉向Kotlin——列舉類和擴充套件Kotlin套件
- Java列舉-通過值查詢對應的列舉Java
- Java enum列舉類詳解 列舉的常見用法Java
- 程式設計與演算法--(列舉-完美立方)程式設計演算法
- C/C++列舉enum分別列印輸出列舉子和列舉值的方法C++
- JAVA基礎:再談在Java中使用列舉(轉)Java
- ENUM列舉型別型別
- Java基礎--列舉Java
- 【java基礎】列舉Java
- Java(4)列舉類Java
- 【java】【列舉使用技巧】Java
- Java列舉解讀Java
- java中的列舉Java