您的位置:程序门 -> vb ->



一个vb api的问题:virtualqueryex返回值为什么总是0?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


一个vb api的问题:virtualqueryex返回值为什么总是0?[已结贴,结贴人:super_119]
发表于:2007-01-23 22:38:25 楼主
下面这段代码相信很多人都看过,为什么我得到的ret全都为0?
调试结果:openprocess成功返回,运行到virtualqueryex时总返回0

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

请教高手这是为什么????为什么在openprocess成功后virtualqueryex返回的一直是0?

如果可以的话请发一实例到小弟的邮箱,谢谢!!
cs5@hotmail.com
发表于:2007-01-23 23:33:481楼 得分:0
在virtualqueryex调用后,调用getlasterror查看错误值
发表于:2007-01-24 20:54:572楼 得分:0
getlasterror返回值为5,请问这是什么意思
发表于:2007-01-24 20:58:033楼 得分:0
拒绝访问。

发表于:2007-01-24 21:22:124楼 得分:0
我用的是xp(sp2)英文系统,softice没有启动,我可以往 "calculater "里发键盘消息,说明窗口句柄已经得到,为什么在调用virtualqueryex时会不让访问呢?
我在网上随便下了一个内存修改类的软件,发现别人的工作起来很正常,这是为什么?错在哪里?

谢谢!!
发表于:2007-01-24 21:32:535楼 得分:0
virtualqueryex(hprocess,   byval   paddr,   mi,   milen)

第二个参数要传值干吗捏?
发表于:2007-01-24 21:36:306楼 得分:0
最二个值是表示查询起始地址,设为0,即进程虚拟地址开始处。
发表于:2007-01-24 21:37:517楼 得分:20
试试不传值,行不行?
发表于:2007-01-24 21:46:058楼 得分:0
hprocess   =   openprocess(process_vm_read,   false,   processid)   '首先打开进程供查询信息
ret   =   virtualqueryex(hprocess,   null,   mi,   milen)     '从起始地址开始查询
msgbox   getlasterror

错误码显示 "5 "
发表于:2007-01-24 22:00:299楼 得分:0
我换了个api,我用virtualquery替代了原来用的virtualqueryex结果就可以了.

private   declare   function   virtualquery   lib   "kernel32 "   alias   "virtualquery "   (lpaddress   as   any,   lpbuffer   as   memory_basic_information,   byval   dwlength   as   long)   as   long

谢谢,看了你的提示后我对比了两个函数,发现前都不需要传值,所以换了一下试试,结果就可以了

不过目前还不知道virtualqueryex出错的原因,如有发现都请分享之.
发表于:2007-01-24 22:39:2410楼 得分:0
晕已经结贴了。。。
刚才仔细看了一下你的代码,我猜想,其实你代码中openprocess的调用没有成功

可以试试
hprocess   =   openprocess(process_vm_read,   false,   processid);
if   hprocess   =   null   then
debug.print   getlasterror
end   if


快速检索

最新资讯
热门点击