【问题标题】:Cannot add 2 pointers无法添加 2 个指针
【发布时间】:2016-07-13 15:11:49
【问题描述】:

我的代码很简单,看起来很简单

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

【问题讨论】:

  • 你不能添加指向指针的指针,这没有任何意义,不清楚该代码在delphi中做了什么
  • 指针包含地址在内存中的位置,就像信封包含邮政地址一样。添加邮政地址没有意义,就像添加指针没有意义一样。您可以向指针添加 偏移量
  • 请不要在您的问题中放置代码图片。只需将代码粘贴为文本即可。
  • ADDR_ONatZeroOFS 看起来是偏移量。只需将它们添加到指针中,不要对它们使用 *reinterpret_cast() 。我会计算地址并将其放在 if () 之前的 PDWORD 变量中。
  • @drescherjm 你是对的,我发布了正确的代码,谢谢

标签: c++ delphi


【解决方案1】:

我只想用C++重写一个Delphi函数

Delphi 代码将数值转换为 PWORD(指向 WORD 的指针)和 PDWORD(指向 DWORD 的指针),但您将所有内容都转换为 PDWORD*(指向 DWORD 的指针) ) 反而。您需要删除*,因为PDWORD 已经是一个指针。 cabalbase 的第一个演员是PWORD,而不是PDWORD。取消引用 PWORD 读取 2 个字节,而取消引用 PDWORD 读取 4 个字节。这有很大的不同。

这是Delphi代码的正确翻译:

#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) {
        // ...
    }
}

我建议使用一些局部变量以使其更易于阅读(和调试):

int main()
{
    WORD w_cabalbase = *reinterpret_cast<PWORD>(ADDR_cabalbase);

    DWORD dw_cabalbase_ofs = *reinterpret_cast<PDWORD>(w_cabalbase + ZeroOFS);

    DWORD dw_onat = *reinterpret_cast<PDWORD>(dw_cabalbase_ofs + ADDR_ONat);

    if (dw_onat == 3) {
        // ...
    }
}

【讨论】:

    【解决方案2】:

    PDWORDP指向 DWORD 的别名。您将ADDR_cabalbase(无论它的类型是什么)转换为一个指向PDWORD 的指针, 即指向一个指向DWORD 的指针的指针。然后取消引用,获得PDWORD,即指向DWORD 的指针。然后你试着把它们加在一起。

    【讨论】:

    • 亲爱的投票者,请解释一下答案有什么问题?我很乐意改进它。
    【解决方案3】:

    感谢@drescherjm 的评论,解决方案是:

    if (*reinterpret_cast<DWORD *>(ADDR_cabalbase+ZeroOFS
            + ADDR_ONat)
            == 0){
    
        }
    

    【讨论】:

    • 此代码与 Delphi 代码中的逻辑不同。 Delphi 代码取消引用位于cabalbase 地址的WORD(不是DWORD!)值,然后将该值加零,然后将结果转换为PDWORD 并取消引用它以获得DWORD 值,将ONat 添加到该值,转换结果并从中取消引用DWORD 值。您上面的代码正在做一些不同的事情。您将零添加到 cabalbase 本身,而不是它指向的 WORD。而且您没有强制转换+取消引用位于添加ONat后获得的地址的DWORD值。
    猜你喜欢
    • 2018-03-12
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2018-04-10
    相关资源
    最近更新 更多