DWORD WINAPI?stdcall?

网络编程实验2_(4)基于流式套接字的服务器程序设计中,创建了以下这个函数:

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,我查找了一些资料,参考链接如下:

C++知识回顾之__stdcall、__cdcel和__fastcall三者的区别

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

__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:编译后,函数名被修饰为“[email protected]”。

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

__fastcall:编译后,函数名给修饰为“@[email protected]”。

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

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

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

__stdcall:编译后,函数名被修饰为“[email protected]@YG******@Z”。

__cdecl:编译后,函数名被修饰为“[email protected]@YA******@Z”。

__fastcall:编译后,函数名被修饰为“[email protected]@YI******@Z”

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

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

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

原文地址:https://www.cnblogs.com/cyx-b/p/12555128.html

时间: 2024-07-29 21:11:18

DWORD WINAPI?stdcall?的相关文章

c编程实例:809*??=800*??+9*???+1

程序代码: #include<stdio.h>#include<stdio.h>void main(){ int c; int i,j,k; printf("start computing!!!"); for(i=10;i<100;i++){ for(j=100;j<1000;j++){ c=i*809-1-9*j; k=c%800; if(k==0){ k=c/800; if(k>10&&k<100) printf(&q

什么是带宽?宽带独享?共享?

所谓带宽(bandwidth)可以通俗理解为单位时间内访问网络的的最大数据流量.如果使用100M网络交换机,局域网带宽可以达到100M:如使用10M交换机则只能达到10M. 主要是访问互联网的速度,这个可以和电信部门推出的"宽带"和"窄带"用户一起综合理解,所谓"窄带"用户,一般指拨号上网用户,通过MODEM拨号上网速度一般不会超过64K,带宽很窄:而"宽带"用户指ADSL或社区宽带网用户,上网速度可以达到512K-100M(

C#中 ? 和?? 的用法

C#中 ?? 和? 的意思 1.? 如果直接定义一个 值类型,给负值null:就会提示“无法将 Null转换成‘值类型(比如:int)’,因为他是一种不可为null的值 de类型” 例如 int in=null;//错误 int? in=null;//正确 string result=null;//正确 因为string是引用类型不是值类 型 string? result=null;//错误,因为?,只能用于值类型 2.?? var name??:“Hello World!”;//如果name为

所有的视图是否都可以更新?为什么?

(1)若视图的字段是来自字段表达式或常数,则不允许对此视图执行INSERT.UPDATE操作,允许执行DELETE操作:      (2)若视图的字段是来自库函数,则此视图不允许更新:      (3)若视图的定义中有GROUP BY子句或聚集函数时,则此视图不允许更新:      (4)若视图的定义中有DISTINCT任选项,则此视图不允许更新:      (5)若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该视图的基表,则此视图不允许更新:      (6)若视图是由

近视?老花眼?恢复视力,就用这一招!

近视?老花眼?恢复视力,就用这一招! 2016-04-18 小编说: 如果家里有小孩近视.老人眼花.玩手机后眼睛疲劳的,都可以用这个方法,不伤眼,帮助恢复视力! 平时习惯 蒸熏眼睛 首先平时习惯是:勤眨眼和用蒸汽熏眼睛:倒杯热水,在温度不烫人时,将眼睛放到杯口熏蒸几分钟. 明目操 另外除了上面的两个习惯以外,还需一套明目操.该操步骤如下: ▲ 看笔尖缓解近视. 1.找把椅子坐下,眼睛正视前方.拿一支铅笔放在面前,眼珠盯着笔尖看,然后慢慢地把笔移近双眼,直到触碰鼻子:继续盯住笔尖,慢慢地把笔移回原

Java培训哪里好?怎么样?

Java培训哪里好?怎么样?据兄弟连Java培训数据统计,最近这两年参加Java培训的人越来越多,Java为什么会这么火呢?它的功能到底有多强大呢,接下来就我自己对Java的了解和大家分享一下. 首先,参加Java培训可以零基础.Java是一门容易入门的技术,即使你没有任何的基础经过一周的培训也能学会其中的门道,所以Java的门槛相对比较低,即使不是计算机专业的学习起来也完全无压力.身边有学设计的朋友在大学毕业时选择了在兄弟连参加Java培训,经过四个多月的强化学习,现在也有一个很不错的Java

出国?上研?工作?回家种田?(一) 出国看世界

本科生毕业主要有四个选择:出国,上研,工作,还有回家种田,不对,其实我是想说创业-- 我自己只是本科毕业找工作了.原先也是在这个问题上面做了很多研究,问过不少人,周围也有不少同学上研.出国之类,这里把我知道的东西给总结一下.其中有些内容也是道听途说,或是自己的理解和猜想,尤其是关于上研情况的看法,作为本科生,其实我没有太多发言权,但是尽量按我所知道和所理解的写一写吧.也希望知道更多情况的人来补充.每个人都有自己的选择,每个选择都有其好处和坏处,没有绝对正确的答案. 出国看世界 出国途径其实很多,

深度学习框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?

深度学习框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?对于这几大框架在运行各项深度任务时的性能差异如何,各位读者不免会有所好奇. 微软数据科学家Ilia Karmanov最新测试的结果显示,亚马逊MXNet在CNN.RNN与NLP情感分析任务上性能强劲,而TensorFlow仅擅长于特征提取. 测试详情更新在Ilia Karmanov的GitHub项目DeepLearningFrameworks(https://github.com/ilkarman/De

日常2018/4/9---b/s和c/s架构分别是什么?区别?

b/s和c/s架构分别是什么?区别? b/s是指前后端分别是 Browser/Server的模式. c/s是指前后端分别是 Client/Server的模式. 参考:https://blog.csdn.net/tennysonsky/article/details/45062079 https://baike.baidu.com/item/Client%2FServer?fromtitle=C%2FS&fromid=826311 上班去了晚上补充 原文地址:https://www.cnblogs