API VirtualQueryEx() 於VB2005使用上的問題 |
缺席
|
gn01307804
一般會員 發表:1 回覆:0 積分:0 註冊:2010-05-26 發送簡訊給我 |
各位大大好,小弟目前在學習使用WINDOWS API,目前碰到了VirtualQueryEx()的使用問題,雖然在網路上翻了不少的文章,不過範例多半是VB6或C++,而在我使用的VB2005上,許多與法與宣告必須要改變卻又常常不知道該改成什麼。
以下是我的程式碼,我希望能夠查詢"遊樂場"這個視窗的記憶體區段 Module Module1 Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, ByRef lpdwProcessId As Long) As Long Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As IntPtr, ByVal bInheritHandle As Integer, ByVal dwProcessId As IntPtr) As IntPtr Public Const PROCESS_ALL_ACCESS = &H1F0FFF Declare Auto Function VirtualQueryEx Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal lpAddress As IntPtr, ByRef lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As IntPtr) As IntPtr Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal lpBaseAddress As Object, ByVal lpBuffer As IntPtr, ByVal nSize As IntPtr, ByVal lpNumberOfBytesWritten As IntPtr) As IntPtr Declare Function CloseHandle Lib "kernel32.dll" (ByVal hwnd As IntPtr) As IntPtr Public Structure MEMORY_BASIC_INFORMATION Dim BaseAddress As Integer '/* 區域的基本地址 */ Dim AllocationBase As Integer '/* 分配基本地址 */ Dim AllocationProtect As Integer '/* 初始訪問保護 */ Dim RegionSize As Integer '/* 區域的字節大小 */ Dim State As Integer '/* 已提交的、保留的、自由的 */ Dim Protect As Integer '/* 當前訪問保護*/ Dim lType As Integer '/* 頁類型*/ End Structure End Module Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim hwnd As IntPtr Dim pid As IntPtr Dim process_id As IntPtr Dim close_p As IntPtr Dim p_m_inf As MEMORY_BASIC_INFORMATION hwnd = FindWindow(vbNullString, "遊樂場") If hwnd <> 0 Then TextBox1.Text = hwnd Else MsgBox("找不到遊樂場") Exit Sub End If GetWindowThreadProcessId(hwnd, pid) If pid <> 0 Then TextBox2.Text = pid Else MsgBox("尋找ID失敗") Exit Sub End If process_id = OpenProcess(PROCESS_ALL_ACCESS, 0, pid) If process_id Then MsgBox("成功開啟") TextBox3.Text = process_id Else MsgBox("開啟失敗") Exit Sub End If VirtualQueryEx(process_id, 0, p_m_inf, Len(p_m_inf)) TextBox4.Text = p_m_inf.BaseAddress TextBox5.Text = p_m_inf.AllocationBase TextBox6.Text = p_m_inf.AllocationProtect TextBox7.Text = p_m_inf.RegionSize TextBox8.Text = p_m_inf.State TextBox9.Text = p_m_inf.Protect TextBox10.Text = p_m_inf.lType close_p = CloseHandle(process_id) If close_p Then MsgBox("成功關閉") Else MsgBox("關閉失敗") Exit Sub End If End Sub End Class 上面的程式碼似乎還不太完整,據我看的文章中,應該是要連續搜尋直到找不到為止,才能知道該視窗的所有記憶體區段。 而我碰到的問題則是在MEMORY_BASIC_INFORMATION這個結構上的型態宣告有問題。 小弟在網路上的文章看過,有的全宣告成integer,也有全宣告成long的,不過我兩者都試過,卻無法獲得完整的訊息。 測試結果如下: 全宣告為long時 Dim BaseAddress As long Dim AllocationBase As long Dim AllocationProtect As Iong 這三個值分別是0,281474976710656,4295032832,其餘為0....(第1項是0應該是正確的) 全宣告成integer時 Dim RegionSize As Integer Dim State As Integer Dim Protect As Integer 這三項的值分別為65536,65536,1,其餘的項目值皆為0 另外我還嘗試過只有AllocationProtect設為long,其他為integer,結果是 Dim AllocationProtect As long Dim RegionSize As Integer Dim State As Integer 這三項分別為281474976710656,65536,1,其餘皆為0 以上就是我的問題狀況....請問各位大大有解嗎@@? 若是有完整的VB2005的範本更好><感激不盡 如果還需要其他東西的話請留言..我會馬上放上來的,感謝。 編輯記錄
gn01307804 重新編輯於 2010-05-26 00:30:20, 註解 無‧
gn01307804 重新編輯於 2010-05-26 00:31:08, 註解 無‧ gn01307804 重新編輯於 2010-05-26 00:31:08, 註解 無‧ gn01307804 重新編輯於 2010-05-26 00:31:08, 註解 無‧ gn01307804 重新編輯於 2010-05-26 00:53:23, 註解 無‧ gn01307804 重新編輯於 2010-05-26 00:54:05, 註解 無‧ gn01307804 重新編輯於 2010-05-26 00:54:19, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |