windows-程序相關操作
程序相關操作
函式 | 功能 |
---|---|
CreateProcess | 建立程序 |
OpenProcess | 開啟程序 |
ExitProcess | 退出本程序 |
TerminateProcess | 結束指定程序 |
WinExec | 啟動一個程序 |
ShellExecute | 執行一個外部程式,或者開啟一個檔案目錄,資料夾等等 |
system | 控制檯命令 |
CreateToolhelp32Snapshot | 建立快照遍歷程序、執行緒、模組、堆 |
開啟一個程序(其實也就是獲得程序控制代碼
函式原型
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
引數
第一個引數dwDesiredAccess表示開啟的程序的許可權,來描述開啟這個程序的控制代碼獲得的許可權有哪些
PROCESS_ALL_ACCESS 這個巨集表示獲得所有的許可權
第二個引數 bInheritHandle表示如果用這個控制代碼建立的程序是否繼承該控制代碼,在這裡我們拿來也沒啥用直接用NULL就好
第三個引數表示要開啟的程序的ID
void Open_Process(int pid)
{
OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
}
返回值
如果開啟成功會返回對於的程序控制代碼,如果失敗則返回NULL
關閉指定程序
函式原型
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
引數
第一個引數表示程序控制代碼
第二個引數表示的是退出程序傳遞的程式碼值,這個基本上是寫作業系統時的程序退出的原因才用的上,這裡直接傳0就好
void Close_Process(HANDLE hProcess)
{
TerminateProcess(hProcess, 0);
}
遍歷程序
函式原型
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
這個函式是包括在tlhelp32.h標頭檔案下的,需要新增使用
引數
第一個引數 dwFlags表示需要遍歷什麼東西。因為它可以遍歷程序執行緒模組和堆這四種東西。
TH32CS_SNAPPROCESS 這個巨集表示的是遍歷系統中的所有程序
第二個引數 表示的是程序的ID,但是這個第二個引數只有在遍歷執行緒,模組和堆的情況下需要,因為執行緒模組和堆都是程序裡面包含的,因為這裡我們是需要的是遍歷程序,所以直接傳0
返回值
如果函式成功,返回開啟的控制代碼到指定的快照,如果失敗則返回INVALID_HANDLE_VALUE
列舉程序
在CreateToolhelp32Snapshot函式中的第一個引數的巨集中提示了列舉程序的辦法,使用Process32First函式,然後在Process32First中有Process32Next函式來訪問快照中的下一個程序,相當於就是說訪問第一個,然後一直下一個下一個
函式原型
BOOL Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
引數
這兩個函式的引數都一樣,第一個引數是快照的控制代碼,第二個引數是一個結構體的指標,在windows程式設計下的p也就是point是指標的意思,l就是long的意思。第二個引數是一個用來描述快照中的程序資訊的一個結構體的指標
LPPROCESSENTRY32
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
該結構體是用來描述快照中的程序的資訊的,在建立結構體的時候需要初始化dwSize,不然就建立失敗,後面的引數不用管,這裡就相當於建立了一個描述程序資訊的結構體來獲取程序資訊,不用賦值因為反正後面都會被獲得的程序的資訊覆蓋
返回值
如果成功的話會返回一個Bool型別
遍歷系統程序的完整程式碼
void Ergodic_Process()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功獲取到了快照中的第一個程序
do
{
printf("程序id=%d,程序名字=%ls\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}
但是這個不支援中文,以下是修正版
void Ergodic_Process()
{
setlocale(LC_ALL, "chs");
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功獲取到了快照中的第一個程序
do
{
printf("程序id=%d,程序名字=%ls\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}