请会VC+VB的高手帮忙翻译这段VC代码成VB

来源:百度知道 编辑:UC知道 时间:2024/04/29 05:14:15
int CJxinit::GetDataAddress(HANDLE hProcess,UINT nSize)
{
int retVal=0;
MEMORY_BASIC_INFORMATION mbi;
PBYTE pAddr=(PBYTE)0x00100000;
int nLen=sizeof(MEMORY_BASIC_INFORMATION);
while(true)
{
ZeroMemory(&mbi,nLen);
if(nLen!=(int)VirtualQueryEx(hProcess,pAddr,&mbi,nLen))
{
break;
}

if(mbi.Protect==PAGE_READWRITE)
{
if(mbi.RegionSize==nSize)
{
retVal=(int)mbi.BaseAddress;
break;
}
}
pAddr=((PBYTE)mbi.BaseAddress+mbi.RegionSize);

}
return retVal;
}
我翻译成VB后但是总是死循环。。
Function GetDataAddress(ByVal nSize As Long) As Long
Dim mbi As MEMORY_BASIC_INFORMATION
Dim pAddr As Long
Dim nLen As Long
Dim DoBol As Boolean
Dim Ret As Long
Dim PAGE_READWRITE: PAGE_READWRITE = &H4
pAddr = &H100000
nLen = Len(mbi)

Do While DoBol = False
ZeroMemory mbi, nLen

你的函数调用有问题,好像是参数不对。注意对参数的传址和传值的不同
Private Declare Sub ZeroMemory Lib "KERNEL32" Alias "RtlMoveMemory" (dest As Any, ByVal numBytes As Long)
这是vb 对zeromemory 函数的引用声明,第一个参数是传址,第二个参数是传值。
Public Declare Function VirtualQueryEx Lib "kernel32" Alias "VirtualQueryEx" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long
这是对 virtualqueryex 的引用声明,第一参数是传值,第二个传址,第三个,传值

像楼上所说的那样注意传值和传址的区别吧,vc中用指针的,就是变量前面加&的那种就,你声明api函数时就在那个参数前面用byref 声明 传地址 方式传参数。

这个好像是说搜索 数据段的 的起始地址吧 , 就是exe文件 映射到内存里面时是分代码段,数据段的,资源段等几个部分的。 他代码从低地址到高地址找出可以读写的(PAGE_READWRITE)的地址,应该就是或者数据段的起始地址的意思吧。 因为想代码段啊那些的属性是不能写的,数据段才具有读写属性。
不过这个属性也是可以改的了,做内存补丁的时候,就需要把代码段的属性改成可以写的。