CreateToolhelp32Snapshot
CreateToolhelp32Snapshot 收藏
CreateToolhelp32Snapshot
CreateToolhelp32Snapshot函數為指定的進程、進程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD])建立一個快照[snapshot]。
HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID );
參數: dwFlags [輸入]指定快照中包含的系統內容,這個參數能夠使用下列數值(常量)中的一個或多個。 TH32CS_INHERIT - 聲明快照句柄是可繼承的。
TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進程的所有的模塊。
TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。
TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
th32ProcessID [輸入]指定將要快照的進程ID。如果該參數為0表示快照當前進程。該參數只有在設置了TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPALL后才有效,在其他情況下該參數被忽略,所有的進程都會被快照。
返回值: 調用成功,返回快照的句柄,調用失敗,返回INVALID_HANDLE_VALUE 。
備注: 使用GetLastError函數查找該函數產生的錯誤狀態碼。
要刪除快照,使用CloseHandle函數
delphi使用實例:
uses TLHelp32;
procedure TForm1.Button1Click(Sender: TObject);
var ProcessName: string;
ProcessID: integer;
ListLoop: Boolean;
FsnapShotHandle: Thandle;
FProcessEntry32: TProcessEntry32;
begin Fsnapshothandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwsize := SizeOF(FProcessEntry32);
Listloop := Process32First(FSnapshotHandle, FProcessEntry32);
while Listloop do begin
ProcessName := FprocessEntry32.szExeFile;
ProcessID := FProcessEntry32.th32ProcessID; // 我寫到列表框中了,你可以根據需要自己改
listbox1.Items.Add('Process NAME:' + ProcessNAme);
ListLoop := Process32Next(FSnapshotHandle, FprocessEntry32);
end;
end;
/
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 Do If Left(LCase(ProcessInfo.szExeFile), InStr(ProcessInfo.szExeFile, ".") + 3) = "notepad.exe" Then '遍歷進程,查找notepad.exe,找到后執行操作....... End If Loop While Process32Next(MySnapHandle, ProcessInfo) <> 0 End If CloseHandle MySnapHandle end sub C++例子: #include "StdAfx.h" #include "windows.h" #include "tlhelp32.h" #include "stdio.h" int main(int argc, char* argv[]) { PROCESSENTRY32 pe32; //在使用這個結構前,先設置它的大小 pe32.dwSize = sizeof(pe32); //給系統內所有的進程拍個快照 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot 調用失敗./n"); return -1; } //遍歷進程快照,輪流顯示每個進程的信息 BOOL bMore = ::Process32First(hProcessSnap,&pe32); while (bMore) { printf("進程名稱:%s/n",pe32.szExeFile); printf("進程ID:%u/n/n",pe32.th32ProcessID); bMore = ::Process32Next(hProcessSnap,&pe32); } //不要忘記清除掉snapshot對象 ::CloseHandle(hProcessSnap); return 0; }
//
為什么必須要使用CloseHandle關閉句柄
?
1,線程和線程句柄(Handle)不是一個東西,線程是在cpu上運行的.....(說不清楚了),線程句柄是一個內核對象。我們可以通過句柄來操作線程,但是線程的生命周期和線程句柄的生命周期不一樣的。線程的生命周期就是線程函數從開始執行到return,線程句柄的生命周期是從CreateThread返回到你CloseHandle()。
2,線程是一種內核對象,系統維護著每一個內核對象,當每個內核對象引用記數為0時,系統就從內存中釋放該對象,CloseHandle就是將該線程對象的引用記數減1。所有的內核對象(包括線程Handle)都是系統資源,用了要還的,也就是說用完后一定要closehandle關閉之,如果不這么做,你系統的句柄資源很快就用光了。
3,如果你CreateThread以后需要對這個線程做一些操作,比如改變優先級,被其他線程等待,強制TermateThread等,就要保存這個句柄,使用完了在CloseHandle。如果你開了一個線程,而不需要對它進行如何干預,CreateThread后直接CloseHandle就行了。
所以
CloseHandel(ThreadHandle );
只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了。并沒有結束線程。
如果你覺得多了一個變量,也可以寫為:
CloseHandel(CreateThread(NULL,0,.....));
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zen_z/archive/2010/05/31/5637548.aspx
總結
以上是生活随笔為你收集整理的CreateToolhelp32Snapshot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:江荣(1984-),男,博士,国防
- 下一篇: 作者:王小兵,男,农业部市场与经济信息司