線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1866
推到 Plurk!
推到 Facebook!

API VirtualQueryEx() 於VB2005使用上的問題

缺席
gn01307804
一般會員


發表:1
回覆:0
積分:0
註冊:2010-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-26 00:28:54 IP:163.22.xxx.xxx 訂閱
 各位大大好,小弟目前在學習使用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, 註解 無‧
系統時間:2024-04-27 20:01:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!