当前位置:编程学习 > VB >>

请教下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后,怎么得到第一个参数(入口地址)呢? --------------------编程问答--------------------
MSDN:
This function(VirtualQuery) reports on a region of pages in the memory of the calling process, and the VirtualQueryEx function reports on a region of pages in the memory of a specified process. 

两者的功能是相似的,除了被查询的进程不同以外。 --------------------编程问答-------------------- 等于没说,我只是要第一个参数的取得方法,你说2者一样,第一个参数不一样,我用VirtualQueryEX的第一个参数放VirtualQuery里就出错! --------------------编程问答-------------------- 你要明白所有然,VirtualQuery里的三个参数相当于VirtualQueryEX时后面三个参数
--------------------编程问答-------------------- 你直接看参数的命名就应该知道哪个对哪个了! --------------------编程问答--------------------
引用 11 楼 zzyong00 的回复:
你要明白所有然,VirtualQuery里的三个参数相当于VirtualQueryEX时后面三个参数


这样用的话,程序出错,说入口地址错误
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,