【发布时间】:2021-06-23 15:18:55
【问题描述】:
我正在开发一个附加到程序并从目标程序中读取一些数据的 dll。我通过查找结构地址并将该地址转换为我的代码中相应结构的指针来做到这一点。
例子:
class Structure {
char pad_1[0x30];
float val1;
float val2
char pad_2[0x20];
Structure* next;
}
如果我发现结构的地址是 0x1234,我可以做 (Structure*)0x1234 并且我可以访问它,请注意有一些填充值,这些值我根本不知道它们是什么或者我不需要它们。
我想在我的代码中编写这个结构(出于可维护性目的),如下所示:
class Structure {
Offset(0x30)
float val1;
float val2;
Offset(0x58) /// 0x30 + 2x floats + 0x20 padding
Structure* next;
}
这个 Offset 宏应该自动添加填充,基本上用 Offset(num) 指定类中字段的偏移量,这个宏应该自动添加这个填充。
我不知道这是否可以使用 C 宏,现在我在 YAML 中定义我的模型并使用 python 脚本来生成它们,但是这有一些缺点......
【问题讨论】:
-
请注意,编译器可以自己添加填充。您需要通知编译器您需要打包结构(一些编译器特定的宏),并且只需插入虚拟字符数组作为自定义填充。在标准 C 或 C++ 中这是不可能的。
-
不,C 和 C++ 都不是这样工作的。
-
Marek R,我的问题是如何使用宏或类似知道字段的偏移量轻松插入这些填充
-
抛开这是否是一个好主意,你的第一个例子有什么问题?毕竟,您正在修补的
structs 不太可能发生太大变化, -
您可以添加静态断言来检查各个字段的偏移量,以确保没有损坏。
标签: c++ c c-preprocessor