无法添加2个指针

时间:2016-07-13 15:11:50

标签: c++ delphi

我的代码很简单,似乎很容易就像

一样
#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;

3 个答案:

答案 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){

    }