win32 api 中关于WINAPI宏的定义是#DEFINE WINAPI _stdcall,关于stdcall的疑问

作者&投稿:齐博 (若有异议请与网页底部的电邮联系)
"在Windows中,宏WINAPI、CALLBACK都定义为_stdcall"这句话是什么意识啊?~

_stdcall 和 __cdecl 都属于调用方式

一般我们在声明函数时都没有显示的说明调用方式,因为不同语言都有不同的默认调用方式

//******************************//
_stdcall

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,由主调用函数采用从右到左的压栈方式进行参数压栈,然后由被调用者弹栈(pop),被调用者自己在退出时清空堆栈。


_cdecl

C语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复(弹栈)。由于主调用函数管理堆栈,所以可以实现变参函数。

/****************************/

_stdcall主调函数压栈,被调函数弹栈,这样被调函数只能根据他的参数表进行弹栈,所以没有办法实现变参
_cdecl主调函数压栈,主调函数弹栈,压栈时已经知道有多个参数,这样可以实现变参

当然它们在汇编的层面 在函数命名的方式上有不同,这点我也不是很清楚,没有去涉及 可以自行去参考书籍

在函数参数处理上不同_stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。WIN32 Api都采用_stdcall调用方式
_cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护。_cedcl约定的函数只能被C/C++调用,每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
由于_cdecl调用方式的参数内存栈由调用者维护,所以变长参数的函数能(也只能)使用这种调用约定。
相应的代码实例见网盘

兄弟没有看仔细全面,这个宏定义是有条件分支的,完整的是这样的:
#ifdef _MAC
#define WINAPI CDECL
#define WINAPIV CDECL
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define WINAPI __stdcall
#define WINAPIV __cdecl
#else
#define WINAPI
#define WINAPIV
#endif
这样完整的看是否看明白了?其实就是一个兼容需求的考虑而已,大部分API宏定义通常都是有这样的作用


陵水黎族自治县17152396703: win32 api 中关于WINAPI宏的定义是#DEFINE WINAPI - stdcall,关于stdcall的疑问 -
文京二十: 兄弟没有看仔细全面,这个宏定义是有条件分支的,完整的是这样的: #ifdef _MAC #define WINAPI CDECL #define WINAPIV CDECL #elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) #define WINAPI __stdcall #define WINAPIV __cdecl #else #define WINAPI #define WINAPIV #endif 这样完整的看是否看明白了?其实就是一个兼容需求的考虑而已,大部分API宏定义通常都是有这样的作用

陵水黎族自治县17152396703: win32汇编程序里,wParam和lParam的含义到底是什么?怎么样去真正理解这两个参数?怎么去运用这两个参数? -
文京二十: 在32位的Windows程序中,WPARAM被定义为UINT(unsigned int),而LPARAM被定义为Long数据类型,这样的两个参数都是32位的. wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数: 一个是...

陵水黎族自治县17152396703: 如何用WIN32API收集参数? -
文京二十: WinMain的第三个参数PTSTR pszCmdLine就是启动程序时用户输入的参数的命令行,但是用空格将各个字符串分开的任务交由用户自己完成.另外调用API函数GetCommandLine()也可以获取命令行字符串.

陵水黎族自治县17152396703: windows api中的wParam和lParam参数能取哪些值? -
文京二十: 在Win 3.x中,WPARAM是16位的,而LPARAM是32位的 在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区别.但是习惯上,通常使用LPARAM传递地址,而WPARAM传递其他参数.具体使用可以看win32 API,实际例子非常多

陵水黎族自治县17152396703: windows api和win32 api有什么区别吗? -
文京二十: 没有区别.windows api 是精确叫法,它源于16-bit Windows,现在也支持64-bit Windows.Win32 API 是不精确叫法,过去它源于16-bit Windows,支持32-bit Windows, 现在也支持64-bit Windows.参考“Overview of the Windows API“

陵水黎族自治县17152396703: 用WIN32平台调用Windows的API时..................... -
文京二十: 项目->属性->配置属性->链接器->System 子系统改为:Windows (/SUBSYSTEM:WINDOWS)

陵水黎族自治县17152396703: WIN32关于网络的API -
文京二十: 网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接...

陵水黎族自治县17152396703: 如何在Visual c++中对Win32 API进行调用 -
文京二十: API函数的调用方法非常方便,只要在文件的开头包含了相应的头文件就可以直接调用了.下面给一个简单的例子:#include "stdafx.h" // 这是VC自动添加的文件,没有什么用途#include <windows.h> // 包含MessageBox函数声明的头文件 int main...

陵水黎族自治县17152396703: win32 api 跟 native api -
文京二十: native api 驱动里使用的函数吧,win32 api 调用从用户模式进入内核模式,通过软件中断方式进入到内核模式,并调用内核的系统;用户态API的,就你所说的那些native API开头是Nt,Zw,Ps,Se等等前缀的一些API吧 听课啊还是难理解的~应该是从属的吧

陵水黎族自治县17152396703: 关于wParam和lParam的问题 -
文京二十: WPARAM 和 LPARAM,消息响应机制 wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数: 一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量.因此根据匈牙利命名法,16位的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网