2

我正在编写一个通用测试函数,它将接受函数地址(从映射文件中读取)和作为逗号分隔数据的参数作为来自套接字的参数。

我能够为已知的函数指针实现它。

喜欢

void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);

使用上述方法,我将在代码库中为所有类型的函数实现编写函数指针。有没有通用的方法来做到这一点?

4

2 回答 2

4

不,因为编译器需要知道如何表示参数。它无法知道排除信息的函数指针类型,因此无法生成调用。

例如,具有少量参数的函数可能会将它们传递到 CPU 寄存器中,从而在调用许多参数时“溢出”到堆栈中。

您可以使用可变参数来解决这个问题,这样做基本上“锁定”了参数传递的方式。当然,它强制被调用的函数处理可变参数,这不是很方便。

于 2012-08-15T14:28:01.480 回答
0

您可以执行以下操作。

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));

于 2012-08-15T14:29:52.313 回答