|
說明 關於Heap的資訊通常是用在行程的記憶體分析上面的,一個Process中Heap的數量通常很多,要完整的列舉完通常要很大量的時間,因此這個範例程式我只把HeapList的ID列舉出來,而不去列舉更細部的Heap資訊,如果想得到更細部的資訊請自行將程式註解的部分拿掉,不過可要有心理準備喔 程式 '此程式需要一個Command,一個ListBox Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long Private Declare Function Heap32ListFirst Lib "kernel32" (ByVal hSnapshot As Long, lphl As HEAPLIST32) As Long Private Declare Function Heap32ListNext Lib "kernel32" (ByVal hSnapshot As Long, lphl As HEAPLIST32) As Long Private Declare Function Heap32First Lib "kernel32" (lphe As HEAPENTRY32, ByVal th32ProcessID As Long, ByVal th32HeapID As Long) As Long Private Declare Function Heap32Next Lib "kernel32" (lphe As HEAPENTRY32) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Const TH32CS_SNAPHEAPLIST = &H1 Private Const TH32CS_SNAPPROCESS = &H2 Private Const TH32CS_SNAPTHREAD = &H4 Private Const TH32CS_SNAPMODULE = &H8 Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Private Const TH32CS_INHERIT = &H80000000 Private Type HEAPLIST32 dwSize As Long th32ProcessID As Long th32HeapID As Long dwFlags As Long End Type Private Type HEAPENTRY32 dwSize As Long hHandle As Long dwAddress As Long dwBlockSize As Long dwFlags As Long dwLockCount As Long dwResvd As Long th32ProcessID As Long th32HeapID As Long End Type Private Const LF32_FIXED = &H1 Private Const LF32_FREE = &H2 Private Const LF32_MOVEABLE = &H4 Private Sub Command1_Click() Dim hAppWnd As Long, hAppProcessID As Long hAppWnd = FindWindow(vbNullString, Text1.Text) GetWindowThreadProcessId hAppWnd, hAppProcessID EnumHeap hAppProcessID End Sub Public Sub EnumHeap(ByVal Processid As Long) Dim lphe As HEAPENTRY32, HeapID As Long, hHeapListSnap As Long Dim HL As HEAPLIST32 Dim HE As HEAPENTRY32 Dim sStr As String hHeapListSnap = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, Processid) HL.dwSize = LenB(HL) If Heap32ListFirst(hHeapListSnap, HL) Then Do '--------------------------------------------------------------------------------------------- ' 警告 以下註解區段除非你有很多時間可以執行 否則別輕易去列舉更細部的Heap資訊 ' 因為Heap區段很小 要列舉完需要非常長的時間 ListBox會溢位 ' HE.dwSize = LenB(HE) ' If Heap32First(HE, HL.th32ProcessID, HL.th32HeapID) Then ' k = 0 ' Do ' If HE.dwFlags = LF32_FIXED Then ' sStr = "不可移動" ' ElseIf HE.dwFlags = LF32_FREE Then ' sStr = "未使用" ' ElseIf HE.dwFlags = LF32_MOVEABLE Then ' sStr = "可移動" ' Else ' sStr = "未知" ' End If ' List1.AddItem "HeapID=" & HE.th32HeapID & _ ' " Address:" & Hex$(HE.dwAddress) & _ ' " Block Size:" & HE.dwBlockSize & _ ' " " & sStr & _ ' " Lock Count:" & HE.dwLockCount ' DoEvents ' Loop While Heap32Next(HE) ' End If '--------------------------------------------------------------------------------------------------- List1.AddItem "Heap ID =" & HL.th32HeapID Loop While Heap32ListNext(hHeapListSnap, HL) End If End Sub 文件出處 Honey 範例下載
整理時間 2003'5,21. |
|
|
|
如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆 |