__stdcall详解(下)
2013-03-15 16:08
197 查看
_cdeclC语言默认的函数调用方法,实际上也是->被调用函数的执行(3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。总的来说函数的参数个数可变的),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。2.(1). 是_ win32 api 应该是DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为(2). 所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是-> 被调用方清除调整堆栈 retn X,ret之后自动弹出 _cdecl 修改而来,其他的都一样3.C/C++中使用,参数压栈顺序与前两者相反。返回时的清栈方式忘记了。。。 _stdcall相当。 _thiscall要求把ecx,eax。返回方式和6. _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以_stdcall调用方式。 C中也只能用这种方式), _cdecl方式,例如下面的函数int scanf(char * fmtStr, ...);(1). _cdecl :对于(编译器会通过后缀名为C++程序文件中的输出函数,函数名会被修饰A.可通过在前面加上.def文件去除函数名修饰。C++程序文件中的输出函数,函数名都会被修饰。对于定义在.def文件去除函数名修饰。 函数名修饰就是编译器在编译期间创建的一个字符串,用来指明函数的定义和原型。c++程序中,为了让)指定名字修饰。另一种需要指定函数名修饰的情况是在汇编程序中调用(2). C语言:“@”符号和其参数的字节数,例如_functionname。”@“符号和其参数的字节数,例如 C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,参数个数甚至参数类型。不管__stdcall调用方式,函数修饰都是以一个“@@YG”,对于__fastcall方式则是D--char H--int K--unsigned long(N--double ....指针的方式有些特别,用const类型的指针。后面的代号表明指针类型,如果相同类型的指针连续出现,以U表示结构类型,通常后跟结构体的类型名,用“Z”标识结束。下面举两个例子,假如有以下函数声明:oid Function2();其函数修饰名则为thiscall),函数的名字修饰与非成员的public)成员函数的标识是“@@IAE”,私有(const关键字,则相应的标识应分别为“@@ABE”。如果参数类型是类实例的引用,则使用“ABV1”。 有两种方式可以检查你的程序中的函数的名字修饰:使用编译输出列表或使用/FAs或obj文件或12._cdecl的线程函数地址,_stdcall的线程函数地址。#define CALLBACK __stdcall //这就是传说中的回调函数
#define APIENTRY WINAPI //DllMain的入口就在这里
#define PASCAL __stdcall
#define APIENTRY WINAPI //DllMain的入口就在这里
#define PASCAL __stdcall
相关文章推荐
- 【C++进阶】__stdcall 详解
- -stdcall详解
- stdcall详解
- _stdcall _cdecl fastcall 调用方式详解
- stdcall、cdecl详解(以及WINAPI和CALLBACK之类的宏对应什么)
- C/C++的调用约定详解——stdcall、cdecl、fastcall、thiscall、naked call
- stdcall详解
- _cdecl 与 _stdcall 详解
- 调用约定(Calling convention)详解(__stdcall,__cdecl,__fastcall)
- stdcall、cdecl调用约定方式详解
- 函数调用详解:__stdcall, __cdecl, __fastcall, thiscall, naked call, __pascal
- 关于函数调用方式__stdcall和__cdecl详解
- -stdcall详解
- __stdcall详解
- stdcall详解
- __stdcall详解
- stdcall、cdecl、fastcall、thiscall 、naked call的汇编详解
- C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall
- __cdecl __stdcall各种调用约定详解
- _stdcall _cdecl fastcall 调用方式详解