2013-03-03 191 views
0

我正尝试在VisualC++中为ReadProcessMemory和WriteProcessMemory创建自己的函数,所以我不必每次都创建新的函数调用时输入所有信息。这个项目是Windows窗体。这里的问题通过函数传递值

void Read(DWORD Add, int Value); 

private: System::Void btnP1Money_Click_1(System::Object^ sender, System::EventArgs^e) 
{ 
int BigMoney = 100000; 
int GetMoneyValue; 
DWORD MonAddr = 0x180A6C8; 

Read(MonAddr, GetMoneyValue); 
} 


void Read(DWORD Add, int Value) 
{ 
HWND window = FindWindow(0, _T("Process Window Name")); 
DWORD pID = NULL; 
DWORD base = dwGetModuleBaseAddress(pID, _T("Game.exe")); 
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
GetWindowThreadProcessId(window, &pID); 

ReadProcessMemory(handle, (LPCVOID)(base+Add), &Value, 4, NULL); 
} 

在游戏中的值是500,但是从阅读()的返回值是0。不知道我做错了。我不想每次在每个按钮单击和复选框勾选时在Read()函数中定义所有内容。

感谢

回答

1

你应该将Read标题修改为

void Read(DWORD Add, int& Value) 

我已经写了小例子工程。请确保您检查变量的内容,而不是地址

void Read(int& Value) 
{ 
    Value++; 
} 

int main(array<System::String ^> ^args) 
{ 
    int GetMoneyValue = 5; 
    Read(GetMoneyValue); 

    Console::WriteLine(GetMoneyValue); 
    //6; 
    return 0; 
} 
+0

谢谢你的回复弗拉德。这正是我对标题所做的。我将函数声明更改为void Read(DWORD Add,int&Value);和函数定义中的标题无效Read(DWORD Add,int&Value){//相同的代码},它会产生那些奇怪的结果。任何想法为什么?谢谢 – Syperus 2013-03-04 18:03:01

+0

@Syperus可以发布ReadProcessMemory函数代码吗? – VladL 2013-03-04 19:15:11

+0

从WINBASE.H'BOOL WINAPI ReadProcessMemory( __in HANDLE hProcess, __in LPCVOID lpBaseAddress, __out_bcount_part(n大小,* lpNumberOfBytesRead)LPVOID lpBuffer, __in SIZE_T n大小, __out_opt SIZE_T * lpNumberOfBytesRead );' – Syperus 2013-03-05 02:03:34

1

您需要通过引用传递,否则该功能获取自己的int的副本:

void Read(DWORD Add, int& Value); 

或者,你可以返回值:

int Read(DWORD Add, int Value) 
{ 
    .... 
    return Value; 
} 
+0

感谢您的回复。是的,我试图返回之前的价值,但我一直得到0.我试图通过参考,但它产生了一些奇怪的结果。我做了void Read(DWORD Add,int&Value);和无效的读取(DWORD添加,诠释和价值) {...},但它产生的1752315632的第一个按钮,点击44293792上第二个按钮的点击输出等..他们是不是随机的,所以我想我可能是通过他们错了。我已经阅读了通过引用传递值,但这是我第一次尝试它。 – Syperus 2013-03-03 23:43:53