我正在尝试创建一个函数来调用位于某个地址的其他函数。 调用另一个函数的函数只接收传入的参数类型(如 char*)、返回类型和参数本身。 但是每次调用函数本身或调用函数后它都会突然崩溃。 基本上,我想要达到的目的是在 C++ 中编写这样的函数:
function callfunc(name,...) --Lua
local func=_G[name];
func(...)
end
这是我的代码:
#include <stdio.h>
#include <stdarg.h>
void testfunc(char *c){
printf("Text: %s\n",c);
}
void callfunc(void *ptr,char ret,char *types,int argc,...){
//#define push(w,h,t) *(t*)(w-sizeof(t))=h; w-=sizeof(t)
#define push(w) asm("push %0"::"r"(w))
typedef void (*funcptr)(...);
typedef char* char_ptr;
funcptr func=(funcptr)ptr;
double d;
char *p;
int n;
va_list vl;
va_start(vl, argc);
for(int i=0;i<argc;i++){
switch(types[i]){
case 'p':
p=va_arg(vl,char_ptr);
printf("Pushing char*: %s\n",p);
push(p);
break;
case 'n':
n=va_arg(vl,int);
printf("Pushing int: %d",n);
push(n);
break;
case 'd':
d=va_arg(vl,double);
printf("Pushing double: %f",d);
push(d);
break;
}
}
va_end(vl);
asm(
"call *%0"
::"r"(func)
);
}
int main(int argc, const char * argv[])
{
//address can be directly set to lets say 0x450F10E0
//we only know what is passed to function, we cant change function itself
callfunc((void*)testfunc,'v',"p",1,"Hi!");
return 0;
}
有人能帮忙吗?
编辑 我要调用的函数是 __stdcall。
最佳答案
不要乱用 va_list
,这是高度不可移植的。特别是,许多平台 ABI 都在寄存器中传递某些参数的参数,您完全忽略了这方面。 (您甚至没有告诉我们您使用的是哪个 ABI。)
标准预见的方法是将 va_list
传递给您要调用的函数,并在那里对参数进行解释。
关于使用先前传递的参数在地址处调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742424/