我的代码很简单,似乎很容易就像
一样#include <cstdint>
#include <windows.h>
#define ADDR_cabalbase 0x01083A90
#define ADDR_ONat 0x35c
#define ZeroOFS 0x0
int main()
{
if ((*reinterpret_cast<PDWORD *>(ADDR_cabalbase)+*reinterpret_cast<PDWORD *>(ZeroOFS))
+ *reinterpret_cast<PDWORD *>(ADDR_ONat)
== 3){
ExitProcess(0);
}
}
但是它给出了一个错误:
Error 1 error C2110: '+' : cannot add two pointers
有人可以告诉我我做错了什么。我只想在C ++中重写一个Delphi函数
procedure TWanda.Timer5Timer(Sender: TObject);
begin
try
if PDWORD(PDWORD(PWORD(cabalbase)^+$0)^+ONat)^ = 3 then
begin
timer9.Enabled:= true;
end;
except {ignore errors} end;
end;
答案 0 :(得分:3)
我只想在C ++中重写一个Delphi函数
Delphi代码将数值转换为PWORD
(指向WORD
的指针)和PDWORD
(指向DWORD
的指针),但是您将所有内容都转换为{{1而是(指向PDWORD*
的指针)。您需要删除DWORD
,因为*
已经是指针。 PDWORD
的第一个演员阵容是cabalbase
,而不是PWORD
。取消引用PDWORD
读取2个字节,而取消引用PWORD
则读取4个字节。这有很大的不同。
这是Delphi代码的正确的翻译:
PDWORD
我建议使用一些局部变量,以便更容易阅读(和调试):
#include <windows.h>
#define ADDR_cabalbase 0x01083A90
#define ADDR_ONat 0x35c
#define ZeroOFS 0x0
int main()
{
if (*reinterpret_cast<PDWORD>(*reinterpret_cast<PDWORD>(*reinterpret_cast<PWORD>(ADDR_cabalbase) + ZeroOFS) + ADDR_ONat) == 3) {
// ...
}
}
答案 1 :(得分:-1)
PDWORD
是 P 对 DWORD 的ointer的别名。您正在将ADDR_cabalbase
(无论其类型是什么)转换为指向PDWORD
的指针,,即指向指向DWORD
的指针。然后取消引用,获取PDWORD
,即指向DWORD
的指针。然后你尝试将它们加在一起。
答案 2 :(得分:-1)
感谢@drescherjm评论,解决方案是:
if (*reinterpret_cast<DWORD *>(ADDR_cabalbase+ZeroOFS
+ ADDR_ONat)
== 0){
}