c++ - 如何将 uintptr_t 值设置为非 uintptr_t 函数的地址?
问题描述
void __fastcall func1(void* ptr, int edxReg)
{
int a = 5;
}
我想获取这个函数的地址并将其设置为一个uintptr_t
变量:
std::uintptr_t addr = &func1;
但是,我不能这样做,因为它不能从 转换void(__fastcall)(void* , int)
为uintptr_t
.
我尝试使用 C++ 样式转换,但没有运气,它只是给了我一个随机值。
我能做些什么呢?命名的函数func1
必须保持原样,它必须是一个void __fastcall
有2个参数的,所以不能改变。
解决方案
C++ 风格的演员在这里是合适的,特别是reinterpret_cast
:
使用 reinterpret_cast 只能完成以下转换,除非此类转换会抛弃常量或易变性。
...
指针可以转换为任何大到足以容纳其类型的所有值的整数类型(例如到 std::uintptr_t)
任何整数或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回相同指针类型的指针保证具有其原始值,否则无法安全地取消引用生成的指针(不能保证相反方向的往返转换;相同的指针可能有多个整数表示)空指针常量 NULL 或整数零不保证产生目标类型的空指针值;为此应使用 static_cast 或隐式转换。
...
因此,例如:
void __fastcall func1(void* ptr, int edxReg)
{
int a = 5;
}
std::uintptr_t addr = reinterpret_cast<std::uintptr_t>(&func1);
然后在需要时,您可以将uintptr_t
back 转换为适当签名的函数指针,以便调用所指向的函数,例如:
typedef void __fastcall (*funcType)(void*, int);
// or: using funcType = void __fastcall (*)(void*, int);
funcType func = reinterpret_cast<funcType>(addr);
func(somePtr, someEdxRegVal);
推荐阅读
- php - Laravel:如何仅在存在另一个特定字段时才使字段成为必需?
- java - 使用 Spring Boot 在 Hibernate-Validator 中重用域模型
- bash - “!”是什么意思?在`同时!数控...; 做...; 完成的意思
- java - 如何处理来自 CompletableFuture.runAsync 的未捕获异常
- spring - Chrome 的 Spring Security 问题
- tensorflow - 从 TensorFlow 访问 S3 的问题
- javascript - 我的 d3-geo 项目只显示点,而不是地图本身
- c++ - 将 solace 专有二进制消息放入 sscanf
- python - 对不平衡数据集的次要类进行上采样
- sql-server - 在 SSISDB 中部署的包执行显示成功,但从未发生写入操作