DWORD WINAPI ClientThread(LPVOID lpParameter)

以前我只学过类似:

int swap(int x,int y)

这样的函数,而这个函数看起来就很诡异,如何理解这个函数呢?

DWORD是数据类型,在这里是返回值,返回32位数据。

在visual studio中WINAPI转到定义可以看到:

#define WINAPI __stdcall

也就是说WINAPI是一个宏,所代表的符号是__stdcall。

WINAPI是函数调用形式,windows API函数采用__stdcall标准调用约定,即由被调用函数来清理栈中的参数,这种方式是不能实现可变参数的。

__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

1.参数传递顺序

2.调用堆栈由谁(调用函数或被调用函数)清理

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__stdcall表示

1.参数从右向左压入堆栈

2.函数被调用者修改堆栈

3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

摘自:

在C语言中,假设我们有这样的一个函数:int function(int a,int b)

调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。

栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改栈,使堆栈恢复原装。

在参数传递中,有两个很重要的问题必须得到明确说明:

当参数个数多于一个时,按照什么顺序把参数压入堆栈函数调用后,由谁来把堆栈恢复原装。在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:

stdcall,cdecl,fastcall,thiscall,naked call

为了深刻理解__stdcall,我查找了一些资料,参考链接如下:

(这位老哥讲的很全面,但是格式有点乱。于是我稍微调整了一下格式)

__stdcall、__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。

调用协议常用场合

__stdcall:Windows API默认的函数调用协议。

__cdecl:C/C++默认的函数调用协议。

__fastcall:适用于对性能要求较高的场合

函数参数入栈方式

__stdcall:函数参数由右向左入栈。

__cdecl:函数参数由右向左入栈。

__fastcall:从左开始不大于4字节的参数放入CPU的ECX和EDX寄存器,其余参数从右向左入栈。

栈内数据清除方式

__stdcall:函数调用结束后由被调用函数清除栈内数据。

__cdecl:函数调用结束后由函数调用者清除栈内数据。

__fastcall:函数调用结束后由被调用函数清除栈内数据。

(1)不同编译器设定的栈结构不尽相同,跨开发平台时由函数调用者清除栈内数据不可行。

(2)某些函数的参数是可变的,如printf函数,这样的函数只能由函数调用者清除栈内数据。

(3)由调用者清除栈内数据时,每次调用都包含清除栈内数据的代码,故可执行文件较大。

C语言编译器函数名称修饰规则

__stdcall:编译后,函数名被修饰为“_functionname@number”。

__cdecl:编译后,函数名被修饰为“_functionname”。

__fastcall:编译后,函数名给修饰为“@functionname@nmuber”。

注:“functionname”为函数名,“number”为参数字节数。

注:函数实现和函数定义时如果使用了不同的函数调用协议,则无法实现函数调用。

C++语言编译器函数名称修饰规则

__stdcall:编译后,函数名被修饰为“?functionname@@YG******@Z”。

__cdecl:编译后,函数名被修饰为“?functionname@@YA******@Z”。

__fastcall:编译后,函数名被修饰为“?functionname@@YI******@Z”

注:“******”为函数返回值类型和参数类型表。

注:函数实现和函数定义时如果使用了不同的函数调用协议,则无法实现函数调用。

C语言和C++语言间如果不进行特殊处理,也无法实现函数的互相调用。

DWORD winapi java_DWORD WINAPI?stdcall?相关推荐

  1. 机器学习编程语言_我应该选择哪种编程语言? 我应该专注于前端吗? 后端? 机器学习?...

    机器学习编程语言 by Preethi Kasireddy 通过Preethi Kasireddy 我应该选择哪种编程语言? 我应该专注于前端吗? 后端? 机器学习? (What programmin ...

  2. 图像数据集如何制作?增强??

    图像数据集如何制作?增强?? 本文使用的BGA图像数据集由X-Ray检测系统平台XD7600NT采集获得,以此为例. BGA图像600张作为数据集,图像的尺寸不一,其中部分图像数据集如图所示.最小的尺 ...

  3. xgboost不能解决哪些问题?为什么?进而说明树模型有哪些缺陷?那种模型能够树模型的这种缺陷?

    xgboost不能解决哪些问题?为什么?进而说明树模型有哪些缺陷?那种模型能够树模型的这种缺陷? 目录

  4. 机器学习的数据类型有哪几种?每种数据类型对应的操作有哪些?为什么?

    机器学习的数据类型有哪几种?每种数据类型对应的合法操作有哪些?为什么? 机器学习中数据的常见类型为如下四种: 大的来说有两类: 数值型:连续属性 (continuous attribute)在定义域上 ...

  5. null?对象?异常?到底应该如何返回错误信息

    null?对象?异常?到底应该如何返回错误信息 参考文章: (1)null?对象?异常?到底应该如何返回错误信息 (2)https://www.cnblogs.com/dsj2016/p/748208 ...

  6. html前端获取地理位置_简单阐述什么是前端?后端?

    前端?后端? 相信很多小伙伴会问:前端不就是我们所能用肉眼直观的看见的网页吗?后端难道是就是网页运行的代码? 结果很明显不是如此,别急今天就来介绍下前端与后端的"故事". 前端 首 ...

  7. php和python web开发-php与python谁更适合web开发?为什么?

    就单纯PHP和python比较的话,甚至说是强大的Java(Java的优势是复杂业务逻辑,企业级应用,当然电商领域例如阿里也喜欢)来说,PHP就是为Web而生的!开课通知:php中文网<第10期 ...

  8. php和python哪个用了开发web好-php与python谁更适合web开发?为什么?

    就单纯PHP和python比较的话,甚至说是强大的Java(Java的优势是复杂业务逻辑,企业级应用,当然电商领域例如阿里也喜欢)来说,PHP就是为Web而生的!开课通知:php中文网<第10期 ...

  9. 在switch case 语句中能否使用continue 关键字?为什么?

    在switch case 语句中能否使用continue 关键字?为什么? #include <stdio.h>   int main()   {       int a;       p ...

  10. 线程池用过吗?ThreadPoolExecutor谈谈你的理解? —— 为什么用线程池?优势?|| 线程池如何使用?

    为什么用线程池?优势? 线程池如何使用?

最新文章

  1. java 下载文件功能代码例子
  2. 基于迭代次数和分类准确率的两种排序
  3. jvm垃圾内存回收问题
  4. 0207.Domino R8.0.x群集配置手册
  5. java原理—反射机制
  6. 饿了么java_eleme-openapi-java-sdk
  7. 删除 Tomcat 上次关闭遗留下来的 SESSION 缓存
  8. python工具用什么语言_Python中一些自然语言工具的使用的入门教程
  9. 计算机考研用python_20年苏州大学计算机考研经验
  10. 阵列卡直通模式和raid模式_Dell R730服务器通过RAID在线扩容方法详解
  11. python星空代码_Python中的唯美星空代码详解!
  12. 关联规则挖掘(Apriori算法)
  13. 2021-06-16 srm平台电子化采购的优势
  14. linux服务器告警信息:Free inodes is less than xx% on /volume 排查
  15. 最新python面试题180题完整版带答案(转载加整理)
  16. 输入框常规测试数据用例设计
  17. 利用 Map-Reduce 从文件中找到出现频率最高的 10 个 URL(2021 VLDB Summer School Lab0)
  18. 在Caffe的训练过程中打印验证集的预测结果
  19. 企业战略 平台转型:不走寻常路
  20. 百度AI攻略:黑白图像上色

热门文章

  1. AutoCAD二次开发学习文档
  2. 维护机房服务器工作,机房维护(服务器搬迁方案).doc
  3. 计算机变网络限速,电脑网速太慢?先别着急找运营商,修改这个限制瞬间变流畅...
  4. IE无法打开internet网站已终止操作的解决的方法
  5. Java实现:冒泡排序
  6. 银行计算机综合知识,银行秋招综合知识测试包含哪些专业课?
  7. Windows MongoDB下载 安装以及配置(一条龙到底)
  8. java wmic_强大的命令行工具wmic
  9. winRAR去广告版
  10. 【软件构造】过程与配置管理