获取成员函数的内存地址
Get memory address of member function?
如何在c++中获得成员函数的绝对地址?(我需要这个来思考。)
成员函数指针不起作用,因为我不能将它们转换为绝对地址(void *
)——我需要知道内存中实际函数的地址,而不仅仅是相对于类型的地址。
在MSVC中存在一种语法来获取成员函数的地址(从MSVC 2005开始)。但这很棘手。此外,无法通过常规方法将获得的指针强制转换为其他指针类型。尽管存在一种方法可以做到这一点。
示例如下:
// class declaration
class MyClass
{
public:
void Func();
void Func(int a, int b);
};
// get the pointer to the member function
void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;
// naive pointer cast
void* pPtr = (void*) pFunc; // oops! this doesn't compile!
// another try
void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)
// tricky cast
void* pPtr = (void*&) pFunc; // this works
即使使用reinterpret_cast
,传统的强制转换也不起作用,这可能意味着MS并不强烈推荐这种强制转换。
然而你可以这样做。当然,这是完全依赖于实现的,您必须知道适当的调用约定来进行思考+具有适当的汇编技能。
试试这个。应该允许你将任意值转换为任意值:)
template<typename OUT, typename IN>
OUT ForceCast( IN in )
{
union
{
IN in;
OUT out;
}
u = { in };
return u.out;
};
然后void* member_address = ForceCast<void*>(&SomeClass::SomeMethod);
默认情况下,c++成员函数使用__thiscall调用公约。为了绕行一个成员函数,既蹦床绕行必须有完全相同的呼叫约定目标函数。不幸的是,VC编译器不支持因此,创建合法的detour和trampoline函数的唯一方法是使它们成为"detour"类的类成员。
此外,c++不支持将指针转换为成员函数指向任意指针。获取原始指针,即地址的成员函数必须移动到临时成员函数中 幸运的是,编译器将优化代码以删除额外的内容指针操作。
来自Microsoft Detour库。他们处理代码注入,并讨论获取非虚成员函数的地址。当然,这是编译器实现特定的东西。
你可以在这里找到这个库http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx
对于仍然在寻找获得函数的内存地址(而不是跳转)的答案的人来说,这是我的解决方案:
UINT32 RelativityToTrampoline = *(UINT32*)((UINT64)&Func + 1);
UINT64 RealFuncAddr = (UINT64)&Func + RelativityToTrampoline + 5;
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- cout 打印内存地址而不是值
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- C++在变量的内存地址上做什么来"deallocate"它?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?