函数指针
通常用来调用别人写的函数
// 声明方式
函数返回值 (调用约定 *变量(函数)名)(参数列表);
int (__stdcall *addFunc)(int,int);
// 给函数指针赋值
函数名 = 函数返回值 (调用约定 *)(参数列表)内存中的函数地址;
addFunc = int (__stdcall *)(int,int)0x40100(call的内存地址);
// 调用该函数
返回值 变量名 = 函数名(参数列表);
int res = addFunc(1,2);
可以自己尝试手动调用系统api函数,例如messagebox
约定调用
告诉编译器怎么传递参数,怎么传递返回值,怎么平衡堆栈
调用约定 | 参数压栈顺序 | 平衡堆栈 | 应用场景 |
---|---|---|---|
__cdecl | 从右到左压栈 | 外平衡。由调用者进行平衡(例如main函数调用了一个add函数,main就是调用者) | 一般自己写的代码默认就是这种约定 |
__stdcall | 从右到左压栈 | 自平衡。由函数自身平衡堆栈 | 使用Windows提供的api ,或者自己编写dll给外部调用的时候 |
__fastcall | ECX/EDX传递前两个参数(从左往右的顺序) 剩下的参数:从右到左压栈 | 自平衡。由函数自身平衡堆栈 | 需要增加函数的执行效率 |
要注意调用约定是否相同,堆栈不平衡程序可能会报错