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