请教下VB里怎么使用VirtualQuery这个函数?
请教下VB里怎么使用VirtualQuery这个函数?怎么定义我知道的,问题光定义还是用不来,因为这个函数第一个参数是要查的内存的入口地址,我不知道这个地址怎么获得,谁教我下,最好有个完整点的范例,谢谢.
我只知道通过窗口名字获得窗口的句柄,然后通过窗口句柄获得进程句柄hProcess,然后,获得进程后,我想搜索改进程里某个数据,所以用到VirtualQuery这个函数判断哪些区域是在使用的.本来想用VirtualQueryEx的,但是这个函数使用后第一次读取后,用循环再读取后,里面的BaseAddress跟RegionSize都是第一次的,你再怎么反复读都不会变化,所以就变死循环了,我也找不出代码哪里有问题,所以想换用VirtualQuery,但是它的第一个参数怎么来的难倒我了,请高手们帮助下吧.
------------------------
另外附上用VirtualQueryEx的代码,如果能解决这个死循环问题也可以啊.
Public Function GetTotalCommittedMemory(ByVal ProcessId As Long) As Long
Dim hProcess As Long
Dim mi As MEMORY_BASIC_INFORMATION
Dim pAddr As Long
Dim dwTotalCommit As Long
Dim ret As Long
Dim miLen As Long
miLen = Len(mi)
dwTotalCommit = 0 '这是结果
pAddr = &H0 '这个时查询起始地址,设为0,即进程虚拟地址开始处。
hProcess = OpenProcess(PROCESS_VM_READ, False, ProcessId) '首先打开进程供查询信息
ret = VirtualQueryEx(hProcess, ByVal pAddr, mi, miLen) '从起始地址开始查询
Do While (ret = miLen)
If mi.State = MEM_COMMIT Then '如果State是MEM_COMMIT则表明这块内存被占用,RegionSize是这一块内存的大小,这一块内存的State都一样
dwTotalCommit = dwTotalCommit + mi.RegionSize
End If
pAddr = mi.BaseAddress + mi.RegionSize '跳过已经查询过的内存块,到未被查询的内存地址起始处
ret = VirtualQueryEx(hProcess, ByVal pAddr, mi, miLen) '再次查询,直到查询失败(所有可查询地址都已经查过了)
Loop
GetTotalCommittedMemory = dwTotalCommit
End Function
-------------如果有办法的请告诉我,发信箱给我你的范例也可以啊,先谢谢了 --------------------编程问答-------------------- Public Const PROCESS_ALL_ACCESS = &H1F0FFF
hProcess = OpenProcess(PROCESS_ALL_ACCESS , False, ProcessId) '首先打开进程供查询信息
补充下,我打开进程是用的这句,不是上面贴的那句,所以不是权限问题,而且我把进程权限也改到debug级别了 --------------------编程问答-------------------- 自己解决了,还是参数传递问题,哎 --------------------编程问答-------------------- 以后提 API 的问题一定要将声明一起贴出来,因为有多种传递方式,最容易犯错的。 --------------------编程问答-------------------- ByVal pAddr 不正确吧。
解决了就好,恭喜楼主……
--------------------编程问答-------------------- 解决了,飘过~~ --------------------编程问答-------------------- 问题是用VirtualQuery怎么用还是不会,VirtualQueryEx会了,谁能教我下VirtualQuery,我还是给分,谢谢. --------------------编程问答-------------------- http://topic.csdn.net/t/20020220/16/534337.html
http://www.qqread.com/other-devtool/j407343.html --------------------编程问答-------------------- 上面的2个帖子还是看不明白,因为第2个要用alloc函数分配内存空间返回的地址,这样的不符合我用的程序的要求,我用的程序是是访问别人的进程,所以用不上alloc函数,那个是自己分配个内存空间才用的.我就是想知道通过别人进程的窗口ID获得进程ID后,怎么得到第一个参数(入口地址)呢? --------------------编程问答--------------------
两者的功能是相似的,除了被查询的进程不同以外。 --------------------编程问答-------------------- 等于没说,我只是要第一个参数的取得方法,你说2者一样,第一个参数不一样,我用VirtualQueryEX的第一个参数放VirtualQuery里就出错! --------------------编程问答-------------------- 你要明白所有然,VirtualQuery里的三个参数相当于VirtualQueryEX时后面三个参数
--------------------编程问答-------------------- 你直接看参数的命名就应该知道哪个对哪个了! --------------------编程问答--------------------
这样用的话,程序出错,说入口地址错误
补充:VB , API