先说一段废话,幸亏我汇编基础(基础 基础 基础)扎实,否则这个问题真的恶心到我了
正题  因为有特殊需求, 需要写一个类似于接口的功能,但是因为用到的次数不多再加上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

下面就放代码,虽然写这个功能主体的时候没有费几分钟

但是我当初遇到之类的问题,百度寻找答案就花了我2天

所以象征的收一下积分,如果实在没积分的,可以联系QQ:515973568(注明来自CSDN和加好友理由)

为了保证代码的真实性,现在放一张部分代码的截图和运行结果

图片上的为初始代码,为了这5个资源分让大家感到值,我上传的cpp里对代码进行了详尽的注释

意在能让大家学会此方法并可以自己扩展使用

下载链接:函数地址调用函数CPP下载地址

最后补充一下,这个不仅仅可以传int的指针,也可以传其他的类型,只要在传值之前强转以下类型即可,会用指针的都晓得

用函数的地址调用函数 C++ MFC的更多相关文章

  1. Js 使用new关键字调用函数和直接调用函数的区别

    最近开始学习js,在看到书上的一个例子时,引发了我的一系列思考: 书上例子: function Person(name,age,job){ var o =new Object(); o.name=na ...

  2. js new一个函数和直接调用函数的区别

    用new和调用一个函数的区别:如果函数返回值是一个值类型(Number.String.Boolen)时,new函数将会返回这个函数的实例对象,而如果这个函数的返回值是一个引用类型(Object.Arr ...

  3. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  4. js new一个函数和直接调用函数的差别

    用new和调用一个函数的差别:假设函数返回值是一个值类型(Number.String.Boolen)时,new函数将会返回这个函数的实例对象.而假设这个函数的返回值是一个引用类型(Object.Arr ...

  5. [C++程序设计]用函数指针变量调用函数

    指针变量也可以指向一个函数.一个函数在编译时被分配给一个入口地址.这个函数入口地址就称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数 #include <iostream ...

  6. shell从函数文件里调用函数

    碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在以下直接调用:一种是通过加载shell,在shell中直接调用:第三种是将函数写入文件 ...

  7. python入门(13)获取函数帮助和调用函数

    Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...

  8. 内置函数:循环调用函数map和filter

    1.map:循环调用函数,前面一定一定要加list,要不然不会被调用 map的格式:list(map(函数名,循环体)) #这里的函数只能写函数名,不要加() list(map(os.mkdir,[' ...

  9. shell 从函数文件中调用函数的方法

    你可以把所有的函数存储在一个函数文件中 你可以把所有的文件函数加载到当前脚本或命令行 加载函数文件中所有函数的方法: source xxx.sh

随机推荐

  1. 设计Account 对象如下:  private long id;       private double balance;       private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: &#

    package homework005; public class Account { private long id; private double balance; private String ...

  2. 认识CoreData-高级用法

    来源:伯乐在线专栏作者 - 刘小壮 链接:http://ios.jobbole.com/87293/ 点击 → 了解如何加入专栏作者 认识CoreData-初识CoreData 认识CoreData- ...

  3. eclipse反编译插件

    eclipse翻译的插件很多,jadclipse 是其中一款.设置很简单. ①.下载net.sf.jadclipse_3.3.0.jar 官方网站:http://sourceforge.net/pro ...

  4. Centos 7 yum 安装Apache

    1.首先查看是否已经安装 rpm    -qa    httpd 2.如果没有 yum     install      httpd      -y rpm    -ql    httpd  查看 3 ...

  5. 网络子系统55_ip协议分片重组_加入ipq

    //ip分片加入到正确的ipq结构 //调用路径:ip_defrag->ip_frag_queue // 处理过程: // 1.正在被释放的ipq,不处理新加入的分片(ipq正在被释放由last ...

  6. BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论

    题目大意:反Nim游戏,即取走最后一个的人输 首先状态1:假设全部的堆都是1,那么堆数为偶先手必胜,否则先手必败 然后状态2:假设有两个堆数量同样且不为1,那么后手拥有控场能力,即: 若先手拿走一堆, ...

  7. paip.mysql备份慢的解决

    paip.mysql备份慢的解决.txt 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  8. 用C++程序理解汉字的机内码表示

    汉字的编码是非常多刚開始学习的人不easy搞不明确的事情.最早的汉字字符集是GB2312-80,收入汉字6763个,符号715个,总计7478个字符,大陆普遍使用的简体字字符集.本文借助于一个能输出这 ...

  9. 函数组:FACS(FI/CO接口的FI服务)

    这个函数组可以执行与财务相关的各种检查,具体功能请自行发掘. 包含下列函数: ACC_ROUNDING_DIFF_DETERMINEACC_ROUNDING_DIFF_LINEITEMAC_KURSF ...

  10. wcf-2

    1.前言 上一篇,我 们通过VS自带的模板引擎自动生成了一个wcf程序,接下来我们将手动实现一个wcf程序.由于应用程序开发中一般都会涉及到大量的增删改查业务,所以这 个程序将简单演示如何在wcf中构 ...