我正在编写一个通用测试函数,它接受一个函数地址(从映射文件中读取)和参数作为逗号分隔数据作为来自套接字的参数。
我能够为已知的函数指针实现它。
喜欢
void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);
通过上述方法,我将为代码库中的所有类型的函数实现编写函数指针。有没有通用的方法来做到这一点?
答案 0 :(得分:4)
不,因为编译器需要知道如何表示参数。它不能知道对于排除信息的函数指针类型,因此它不能生成调用。
具有少量参数的函数可能会在CPU寄存器中传递它们,例如,在调用许多参数时“溢出”到堆栈。
你可以使用varargs解决这个问题,这样做基本上会“锁定”参数的传递方式。当然,它强制被调用的函数来处理varargs,这不是很方便。
答案 1 :(得分:0)
您可以执行以下操作。
fn_t fncptr;
fncptr= MapAddress + 0x(offset);
MapAdress是将文件映射到内存地址的位置。 (如果C ++编译器无法将偏移量添加到void,则可以转换为DWORD)Offset是文件中的函数代码。但是记住,你需要在windows中指针的exetuce地址是PAGE_EXETUCE_READWRITE。然后打电话吧,
fncptr(arg1, arg2, arg3);
如果编译器在第一个代码中失败,请执行以下操作: fn_t fncptr; fncptr =(fn_t)((DWORD)MapAddress + 0x(offset));