Win32進程創建、進程快照、進程終止用例


進程創建:
1
#include <windows.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 // 創建打開系統自帶記事本進程 7 STARTUPINFO si1 = {sizeof(si1)}; 8 PROCESS_INFORMATION pi1; 9 char * szCmdLine1 = "notepad"; 10 if(::CreateProcess(NULL, szCmdLine1, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1)) 11 printf("Create notepad process successfully!\n"); 12 13 14 // 新建一個cmd進程窗口 15 char* szCmdLine2 = "cmd"; 16 STARTUPINFO si2 = {sizeof(si2)}; 17 PROCESS_INFORMATION pi2; 18 si2.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成員有效 19 si2.wShowWindow = TRUE; // 此成員設為TRUE的話則顯示新建進程的主窗口,FALSE不顯示 20 21 BOOL bRet = ::CreateProcess( 22 NULL, // 不在此指定可執行文件的文件名 23 szCmdLine2, // 命令行參數 24 NULL, // 默認進程安全性 25 NULL, // 默認線程安全性 26 FALSE, // 指定當前進程內的句柄不可以被子進程繼承 27 CREATE_NEW_CONSOLE, // 為新進程創建一個新的控制台窗口,如果為NULL,不會創建新的窗口 28 NULL, // 使用本進程的環境變量 29 NULL, // 使用本進程的驅動器和目錄 30 &si1, 31 &pi2); 32 33 if (bRet) 34 { 35 // 既然不使用兩個句柄,最好是立刻將它們關閉 36 ::CloseHandle(pi2.hThread); 37 ::CloseHandle(pi2.hProcess); 38 printf("新進程的進程ID號:%d\n", pi2.dwProcessId); 39 printf("新進程的主線程ID號:%d\n", pi2.dwThreadId); 40 } 41 42 return 0; 43 }

運行效果:

 

 進程快照
1
#include <windows.h> 2 #include <TLHELP32.H> // 聲明快照函數的頭文件 3 #include <stdio.h> 4 5 int main() 6 { 7 PROCESSENTRY32 pe32; 8 pe32.dwSize = sizeof(pe32); 9 10 // 給系統內的所有進程拍一個快照--改函數用於獲取系統指定進程的快照,也可以傳入不同參數獲取被這些進程使用的堆、模塊和線程的快照 11 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 12 if (hProcessSnap == INVALID_HANDLE_VALUE) 13 { 14 printf("CreateToolhelp32Snapshot 調用失敗!\n"); 15 return -1; 16 } 17 18 // 遍歷進程快照,輪流顯示每個進程的信息 19 BOOL bMore = ::Process32First(hProcessSnap, &pe32); 20 while(bMore) 21 { 22 printf("進程名稱:%s\n", pe32.szExeFile); 23 printf("進程ID號:%u\n\n", pe32.th32ProcessID); 24 bMore = ::Process32Next(hProcessSnap, &pe32); 25 } 26 27 // 不要忘記清除掉snapshot 對象 28 ::CloseHandle(hProcessSnap); 29 return 0; 30 }

注釋:
CreateToolhelp32Snapshot 用於獲取系統內指定進程的快照,也可以獲取被這些進程使用的堆、模塊和線程的快照。函數的具體用法是。
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 用來指定“快照”中需要返回的對象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID // 一個進程ID號,用來指定要獲取哪一個進程的快照,當獲取系統進程列表或獲取當前進程快照時可以設為0
);
本函數不僅可以獲取進程列表,也可以用來獲取線程和模塊等對象的列表。dwFlags 參數指定了獲取的列表的類型,其值可以是:
TH32CS_SNAPHEAPLIST 枚舉 th32ProcessID 參數指定的進程中的堆。
TH32CS_SNAPMODULE 枚舉 th32ProcessID 參數指定的進程中的模塊。
TH32CS_SNAPPROCESS 枚舉系統范圍內的進程,此時 th32ProcessID 參數被忽略。
TH32CS_SNAPTHREAD 枚舉系統范圍內的線程,此時 th32ProcessID 參數被忽略。
函數執行成功將返回一個快照句柄,否則返回 INVALID_HANDLE_VALUE(即-1) 。
從快照列表中獲取進程信息需要使用 Process32First 和 Process32Next 函數, 函數的每次調用僅返回一個進程的信息。Process32First 函數用來進行首次調用,以后的調用由
Process32Next 函數循環完成,直到所有的信息都被獲取為止。當不再有剩余信息的時候,函數返回 FALSE,所以程序中使用下面的循環結構來獲取進程列表。
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{ // 在這里處理返回到 PROCESSENTRY32 中的進程信息
bMore = ::Process32Next(hProcessSnap, &pe32);
}

運行效果:

 

終止進程:

終止進程也就是結束程序的執行,讓它從內存中卸載。進程終止的原因可能有 4 種:
(1)主線程的入口函數返回。
(2)進程中一個線程調用了 ExitProcess 函數,該函數只能終止當前進程。
(3)此進程中的所有線程都結束了。
(4)其他進程中的一個線程調用了 TerminateProcess 函數。

終止當前進程:
void ExitProcess(UINT uExitCode); // 參數uExitCode 為此程序的退出代碼。

終止其他進程:
BOOL TerminateProcess(
    HANDLE hProcess, // 要結束的進程(目標進程)的句柄
    UINT uExitCode  // 指定目標進程的退出代碼,你可以使用GetExitCodeProcess 取得一個進程的退出代碼
);

  在對一個進程操作前, 必須首先取得該進程的進程句柄。 CreateProcess 函數創建進程后會返回一個進程句柄,而對於一個已經存在的進程,只能使用 OpenProcess 函數來取得這個進程
的訪問權限,函數用法如下:

 HANDLE OpenProcess(
    DWORD dwDesiredAccess, // 想得到的訪問權限,可以是PROCESS_ALL_ACCESS等
    BOOL bInheritHandle,   // 指定返回的句柄是否可以被繼承
    DWORD dwProcessId      // 指定要打開的進程的ID 號
  );

 一般使用下面的代碼來終止一個進程:
 BOOL TerminateProcessFromId(DWORD dwId)
 {
    BOOL bRet = FALSE;
   // 打開目標進程,取得進程句柄
   HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
   if(hProcess != NULL)
   { // 終止進程

    bRet = ::TerminateProcess(hProcess, 0);
   }
   CloseHandle(hProcess);
   return bRet;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM