兴城什么餐厅吃起来便宜?

WINAPI和回调有什么区别?_stdcall_cdecl_pascal_fastcall这些关键字是什么意思?有什么区别?

首先看看MSDN给出的解释,但是有些解释很模糊,WINAPI。

使用于placeoffarpascalipadiclarations。如果yourewritingadlwithexportadapientrypoints,则youcanusethisforyourownAPIs。回收

useinplaceoffarpascalinapplicationcallbackroutinsuchwindow procedures和dialogprocedures。我们来看看这两个宏的内容是什么,VC:WINDEF.h

# definecallbackPascal/= _pascal,VC不再支持直接使用_pascal。

# defineWINAPICDECL//= _ cdeclBCB:windef . h

#defineCALLBACK__stdcall

#defineWINAPI__stdcall引出一些可能比较少见的关键字,比如cdeclstdcall。那么cdecl、pascal、stdcall、fastcall这些修饰符是什么意思呢?

很简单,只是一些关于堆栈的解释,首先是函数参数的堆栈顺序,其次是

谁来清除堆栈的内容,调用者还是函数本身?

这些开关用来告诉编译器产生哪种汇编代码。以下区别列表如下:directiveparameteorderclean-UppercassesparameterSinRegisters?

注册从左到右路线是

pascalLeft-to-rightRoutineNo

cdeclRight-to-leftCallerNo

stdcallRight从右向左路由否

SafecallRight-to-leftRoutineNo简单描述:__cdecl是C/C++和MFC程序默认使用的调用约定,也可以通过在函数声明中添加__cdecl关键字来手动指定。采用__cdecl约定时,函数参数从右到左放入堆栈,调用者将参数弹出堆栈以清理堆栈。因此,实现可变参数的函数只能使用这种调用约定。因为每个使用__cdecl约定的函数都包含清理堆栈的代码,所以生成的可执行文件会相对较大。__cdecl可以写成_cdecl。

__stdcall调用约定用于调用Win32API函数。采用__stdcal约定时,函数参数从右向左放入堆栈,被调用的函数在返回前清理传递参数的堆栈,函数参数个数固定。因为函数体本身知道传递参数的个数,所以被调用的函数在返回之前可以直接用retn指令清理传递参数的堆栈。__stdcall可以写成_stdcall。

__fastcall约定用于对性能要求非常高的情况。__fastcall约定将函数的两个参数从左边开始,大小不超过4字节(DWORD)分别放在ECX和EDX寄存器中,其余参数仍在堆栈上从右向左传输。被调用的函数在返回之前清理被传递参数的堆栈。__fastcall可以写成_fastcall。

特殊说明

1.默认情况下,采用__cdecl模式,因此可以省略。

2.WINAPI一般用于修饰动态链接库中的导出函数。

3.回调只用于修饰回调函数。

4.你可能发现VC和BCB下WINAPI的定义是不一样的,所以至少你懂了。

我们不能从BCB直接调用VC的dll的一个原因。