用内存地址声明函数
Declare function with memory address
我正在尝试通过其内存地址调用一个函数。
我做过类似的事情:
int GetNewValue(int args)
{
return args * 2;
}
int main()
{
/*
Function address: 0x22feac
*/
int(*GetVal)(int) = 0x22feac; // instead of '&GetNewValue'
}
但是在编译时,我得到以下错误:
[Error] invalid conversion from int
to int (*)(int)
[-fpermissive
]
如何从地址调用方法?
(请注意,上面的示例为简单起见使用常量,但在我的实际代码中,我从 DLL 注入中挂接了一个函数。)
地址0x22feac
看起来像普通代码地址space中的任何地址。但这取决于您的环境。在源代码中使用由数字文字指定的地址通常不是一个好主意。
但是可能有一个地址是您从外部获得的,例如来自 Windows 函数 GetProcAddress
。如果你确定你真的知道你在做什么,那么你可以将这样的值赋给一个函数指针:
intptr_t functionAddress = 0x22feac;
auto GetVal = reinterpret_cast<int(*)(int)>(functionAddress);
auto
允许您遵循 "Don't repeat yourself" 模式。
我正在尝试通过其内存地址调用一个函数。
我做过类似的事情:
int GetNewValue(int args)
{
return args * 2;
}
int main()
{
/*
Function address: 0x22feac
*/
int(*GetVal)(int) = 0x22feac; // instead of '&GetNewValue'
}
但是在编译时,我得到以下错误:
[Error] invalid conversion from
int
toint (*)(int)
[-fpermissive
]
如何从地址调用方法?
(请注意,上面的示例为简单起见使用常量,但在我的实际代码中,我从 DLL 注入中挂接了一个函数。)
地址0x22feac
看起来像普通代码地址space中的任何地址。但这取决于您的环境。在源代码中使用由数字文字指定的地址通常不是一个好主意。
但是可能有一个地址是您从外部获得的,例如来自 Windows 函数 GetProcAddress
。如果你确定你真的知道你在做什么,那么你可以将这样的值赋给一个函数指针:
intptr_t functionAddress = 0x22feac;
auto GetVal = reinterpret_cast<int(*)(int)>(functionAddress);
auto
允许您遵循 "Don't repeat yourself" 模式。