先说一段废话,幸亏我汇编基础(基础 基础 基础)扎实,否则这个问题真的恶心到我了
正题 因为有特殊需求, 需要写一个类似于接口的功能,但是因为用到的次数不多再加上C++写接口各种麻烦所以想通过函数的地址调用该函数,并且能正常的传递参数.但调用过程和被调函数是不在一个类的,调用起来又是各种麻烦这几天我翻烂了百度, 都没找到方法,什么函数回调啊,通过函数地址调用函数啊,还有什么接口之类的天......最后想起来我之前用过的易语言里有人写过这个功能,打算拷贝过来,但是也有不足(稍后会说),先上翻译成C++的代码,易语言的就不贴了 int ___CALL(int a, int *b=NULL, int *c=NULL, int* d=NULL, int* e=NULL, int* f=NULL, int* g=NULL, int* h=NULL, int* i=NULL, int* j=NULL)
//a是函数地址,后面的变量是该函数需要的参数,多余的可以省略为NULL
{
__asm
{
leave
pop eax
xchg[esp], eax
jmp eax
}
return 0;
} 这个方法经过我多方面的证明,是可以用的(VS2015的C++ MFC中),在Debug中会有ESP被未知调用的警告,Release中则无其他问题
如图 但是,当a函数的参数多余1个时(参数个数>1),这个就回报错
如图
下面就放代码,虽然写这个功能主体的时候没有费几分钟
但是我当初遇到之类的问题,百度寻找答案就花了我2天
所以象征的收一下积分,如果实在没积分的,可以联系QQ:515973568(注明来自CSDN和加好友理由)
为了保证代码的真实性,现在放一张部分代码的截图和运行结果
图片上的为初始代码,为了这5个资源分让大家感到值,我上传的cpp里对代码进行了详尽的注释
意在能让大家学会此方法并可以自己扩展使用
下载链接:
最后补充一下,这个不仅仅可以传int的指针,也可以传其他的类型,只要在传值之前强转以下类型即可,会用指针的都晓得