C++学习笔记————WINAPI宏定义

在学习时,发现有一个代码实例中的方法函数定义如下:

DWORD WINAPI Fun(LPVOID lpParamter)
{
    for (int i = 0; i < 10; i++)
        cout << "A Thread Fun Display!" << endl;
    return 0L;
}

DWORD之前在OCX控件中接触过了,是windows环境中定义的数据类型,本质就是 unsigned int 型,但是后面的WINAPI之前并没有接触过,所以决定稍稍了解一下。

其实WINAPI是C语言中的一种调用方式,WINAPI是一个宏,所代表的符号是__stdcall, 函数名前加上这个符号表示这个函数的调用约定是标准调用约定,windows API函数采用这种调用约定。

具体的C语言各种调用方式详解我找到了一位大佬的总结,很厉害:
C++ 小知识点WINAPI

总体来说,stdcall的调用约定意味着
1)参数从右向左压入堆栈;
2)函数自身修改堆栈;
3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。

对于参数从右向左压入堆栈,我疑惑压栈的顺序是从右往左还是从左往右有何区别,经过查找资料,我找到了一个解释:

标准C参数压栈次序是反向压栈,也就是从右到左。因为C要把不定参数…放在最右边,为了高效率定位参数,所以只能从右到左压栈,这样第一个参数最靠近栈顶。

比如printf (const char * szFormat,…);如果从左到右压不容易找到第一个参数szFormat

不过16位操作系统的时候,调用API函数时,微软的vc曾经支持过一种从左到右的压占次序,现在32位系统没有了。

对于什么时候使用WINAPI宏定义,我暂时只知道:
1.在程序中需要调用WindowsAPI的方法时,有些方法的接口声明和定义会用到WINAPI宏。
2.在编写Windows应用程序时(如C编写windows窗口程序),其中调用的函数声明和定义时需要加上WINAPI宏。
3.在进行C++thread多线程编程时线程调用的程序必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
 

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值