process32First是一個進程獲取函式,當我們利用函式CreateToolhelp32Snapshot()獲得當前運行進程的快照後,我們可以利用process32First函式來獲得第一個進程的句柄。
其原型為(用的是vfp)
DECLARE INTEGER Process32First IN WIN32API ;1
INTEGER hSnapshot,STRING @ lppe
在C語言中如下
BOOL WINAPI Process32First( HANDLE hSnapshot,//_in LPPROCESSENTRY32 lppe//_out);
其中PROCESSENTRY32結構為:
PROCESSENTRY32 結構如下:
typedef struct tagPROCESSENTRY32 { DWORD dwSize; // 結構大小; DWORD cntUsage; // 此進程的引用計數; DWORD th32ProcessID; // 進程ID; DWORD th32DefaultHeapID; // 進程默認堆ID; DWORD th32ModuleID; // 進程模組ID; DWORD cntThreads; // 此進程開啟的執行緒計數; DWORD th32ParentProcessID;// 父進程ID; LONG pcPriClassBase; // 執行緒優先權; DWORD dwFlags; // 保留; WCHAR szExeFile[MAX_PATH]; // 進程全名;} PROCESSENTRY32;
此函式往往和
Process32Next(
Handle hsnapShot,
LPPROCESSENTRY32 lppe)
搭配使用,用來枚舉當前系統快照相關的所有進程。
函式返回值:成功返回true,否則返回false.
vb實例
Private Type PROCESSENTRY32
dwSize As Long
cntUseage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
swFlags As Long
szExeFile As String * 1024
End Type
Private Sub demo()
Dim MySnapHandle As Long
Dim ProcessInfo As PROCESSENTRY32
MySnapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
ProcessInfo.dwSize = Len(ProcessInfo)
If Process32First(MySnapHandle, ProcessInfo) <> 0 Then
'用來判斷快照MySnapHandle 成功獲得進程信息
end if
end sub
===============================================================================
C/C++
Code:
PROCESSENTRY32 p;PROCESSENTRY32 *info = &p;// 在使用這個結構之前,先設定它的大小info->dwSize = sizeof(PROCESSENTRY32 );char proName[] = {"devenv.exe"};HANDLE handlePro = NULL; //結束進程句柄// 給系統內的所有進程拍一個快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap == INVALID_HANDLE_VALUE){ printf(" CreateToolhelp32Snapshot調用失敗! \n"); return -1;}// 遍歷進程快照,輪流顯示每個進程的信息BOOL bMore = ::Process32First(hProcessSnap, info);BOOL terminate = FALSE;while( bMore != FALSE){ if(strcmp(proName,info->szExeFile) == 0) { handlePro=OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID); if (NULL == handlePro) { break; } //結束進程 terminate = TerminateProcess(handlePro, 0); }bMore = Process32Next(hProcessSnap, info);}::CloseHandle(hProcessSnap);
===============================================================================