1. 程式人生 > 實用技巧 >windows-程序相關操作

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));
}
}