void foo(int fmt, ...)
{
}
//I hook foo
static void (*original_foo)(int fmt, ...);
void replaced_foo(int fmt, ...)
{
printf("Hooking");
va_list args;
va_start(args, fmt);
//do something
va_end(args);
//但是我想调用original_foo函数, //我不知道如何调用它...
}
//Hook Function not include ...
Hook(foo, replaced_foo, (void **)&original_foo);
最佳答案
如果您有一个相应的original_foo_v()
,它需要一个va_args
,那么您很幸运:您可以使用它。
如果您不这样做(例如,如果您使用 DbgPrintf()
或 LStrPrintf()
与 LabVIEW 交互),则必须在您的拥有。
本质上,你必须
- 检查您获得的
va_list
, - 通过沿着堆栈查找其堆栈框架,
- 根据需要在堆栈上分配尽可能多的内存,假设您需要
va_list
指向的位置和下一个堆栈帧之间的整个区域, - 调用非
va
感知函数。
当然,您必须对您想要支持的每个平台执行此操作...
祝你好运,玩得开心。
关于c/c++ va_list 关于钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13450162/