• 如何取得Process中Heap的狀態

說明

    關於Heap的資訊通常是用在行程的記憶體分析上面的,一個Process中Heap的數量通常很多,要完整的列舉完通常要很大量的時間,因此這個範例程式我只把HeapList的ID列舉出來,而不去列舉更細部的Heap資訊,如果想得到更細部的資訊請自行將程式註解的部分拿掉,不過可要有心理準備喔

程式

    '此程式需要一個Command,一個ListBox
    Option Explicit

    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.

VB心得筆記歡迎各位的指教,如果您有任何文章或資料願意提供給我們的,請來信到VBNote

如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆