您的位置:首页 > 其它

__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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  __stdcall