日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CreateToolhelp32Snapshot

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。