好的,所以我已经使用了函数指针一段时间了.我试图弄清楚这是否可行.
第一.可以将函数指针转换为字节数组.
也可以用该数组中的字节重建该函数.
我想将一个函数保存到一个字节数组中,然后将其保存到文本文件(func.dat)中.然后读取该文本文件并执行特定功能......是否可能?似乎应该有可能我遇到的唯一问题是找到构成函数的数组的大小.
有没有办法做到这一点?
int func()
{
return 1+1;
}
int main()
{
int (*foo)() = func;
char* data = (char*)func;
// write all the data
char* copyFunc = new char[sizeof(func)];
for(int i = 0; i < sizeof(func); i++)
copyFunc[i] = data[i];
int (*constructedFoo)() = (int (*)())copyFunc;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然这段代码不会编译,因为sizeof不适用于函数,有没有人知道如何获得函数的大小?或者函数页眉/页脚的大小.
我尝试过类似的东西
int func()
{
1+1;
new char('}');
}
Run Code Online (Sandbox Code Playgroud)
然后搜索了} char(作为函数的结尾)但该大小不起作用.
如果你想知道为什么我需要它,它可以用来说,发送一个函数到远程计算机执行(考虑并行处理)或者甚至将函数保存在文件中,就像在我的第一个例子中稍后使用,这个可以提供帮助.
任何帮助是极大的赞赏.
您在C/C++中无法实现的目标.首先,函数在二进制文件的内存中可能不连续.所以没有明确的"大小".
其次,你不能只是将它加载到另一个程序并执行它,因为它会违反内存保护(除了地址空间之外).
最后(如果你设法得到这么远),函数中的所有非相对跳转和引用都可能被破坏.
编辑:
将代码发送到远程计算机的方法是发送整个(编译的)二进制文件.然后让本地和远程机器进行通信.
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |