You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++转Delphi:this[-0x00003111]的理解与代码转换求助

拆解C++代码并转换为Delphi版本

嘿,我来帮你把这段代码弄明白,再转换成Delphi版本~

先解释你困惑的&this[-0x00003111]

在C++里,this是指向当前类对象的指针(比如MyClass* this)。指针的下标运算有个小技巧:

  • ptr[n]等价于*(ptr + n):把指针往后偏移n个当前指针类型大小的位置,再解引用
  • 反过来,ptr[-k]就等价于*(ptr - k):把指针往前偏移k个当前指针类型大小的位置,再解引用

而&this[-0x3111]其实是个简化写法:因为&*(ptr - k)的结果就是ptr - k(解引用后再取地址,等于原偏移后的指针本身),所以这段代码等价于this - 0x3111。

⚠️ 注意:这里的偏移是按当前类对象的大小计算的,比如如果当前类大小是4字节,那最终地址就是(uintptr_t)this - 0x3111 * 4。但原代码里用reinterpret_cast<unsigned int>转成整数,大概率是想做字节级偏移(而不是对象大小级)——那这段C++代码其实写得不太严谨,正确的字节偏移写法应该是:

reinterpret_cast<unsigned int>(reinterpret_cast<unsigned char*>(this) - 0x3111)

转换成Delphi代码

Delphi里对应this的是Self,我们分两种情况处理:

情况1:原代码确实是按对象大小偏移(少见)

假设你的类是TMyClass,代码如下:

var
  OffsetAddr: UInt32;
begin
  OffsetAddr := UInt32(NativeInt(Self) - $3111 * SizeOf(TMyClass));
end;

情况2:原代码意图是字节级偏移(更可能)

这是最常见的内存hack场景,直接把Self转成整数后减去十六进制的$3111即可:

var
  OffsetAddr: UInt32;
begin
  OffsetAddr := UInt32(NativeInt(Self) - $3111);
end;

对应原C++代码的完整转换

原C代码里的两次转换(reinterpret_cast+static_cast)在Delphi里可以简化成上面的写法,因为NativeInt(Self)已经把指针转成整数类型,再转成UInt32就对应C的unsigned int。


内容的提问来源于stack exchange,提问作者Robbie Nam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:15