我按照网上的例程查内存情况,发现lBaseAddress第一次运行后不再变化,造成死循环。但是我查了3天网上相关文章,都是这个做法!我到底错在哪里那???高手来救命啊Private Sub Command1_Click()
    Dim lPid As Long
    GetWindowThreadProcessId Me.hwnd, lPid
    
    Dim hProcess As Long
    hProcess = OpenProcess(&H400, False, lPid)    If hProcess <> 0 Then
        Dim mbi As MEMORY_BASIC_INFORMATION
        Dim lBaseAddress As Long: lBaseAddress = 0
        Dim lVirtualQueryExReturn As Long
        Dim lMemoryCount As Long: lMemoryCount = 0
        
        While VirtualQueryEx(hProcess, lBaseAddress, mbi, Len(mbi)) = Len(mbi)
            lBaseAddress = mbi.BaseAddress + mbi.RegionSize
            'lBaseAddress = mbi.AllocationBase+ mbi.RegionSize 换成这样一样死
            'lBaseAddress = lBaseAddress + mbi.RegionSize 换成这样一样死
            If mbi.State = MEM_COMMIT Then lMemoryCount = lMemoryCount + 1
        Wend
        
    Else
        MsgBox "handle not find"
    End If
    
    CloseHandle hProcess
    MsgBox (lMemoryCount / 1024)
End Sub

解决方案 »

  1.   

    还是错!
    Private Function GetMemorySize()
        Dim lProcessID As Long
        GetWindowThreadProcessId Me.hwnd, lProcessID
        
        Dim lProcessHandle As Long
        lProcessHandle = OpenProcess(&H400&, False, lProcessID)
        
        Dim si As SYSTEM_INFO
        GetSystemInfo si
        
        If lProcessHandle <> 0 Then
                Dim lpAddressStart, lMemorySize As Long
                Dim lret As Long
                Dim lpMBI As MEMORY_BASIC_INFORMATION            lpAddressStart = si.lpMinimumApplicationAddress
                lMemorySize = 0
                               
                Do While (lpAddressStart < si.lpMaximumApplicationAddress)
                    lret = VirtualQueryEx(lProcessHandle, lpAddressStart, lpMBI, Len(lpMBI))
                    If lret <> Len(lpMBI) Then Exit Do
                    If lpMBI.State = Mem_Commit Then lMemorySize = lMemorySize + lpMBI.RegionSize
                    lpAddressStart = lpAddressStart + lpMBI.RegionSize
                Loop
                
        End If   
        Close lProcessHandle
        GetMemorySize = lMemorySizeEnd Function