Win32编程_Li_Zhi_Yao的博客-程序员秘密

技术标签: Win32  C/C++  


前言

记录部分实用Win32编程知识,方便查阅



一、VS编译过程

源文件(*.c / *.cpp) --> 编译器(cl.exe) --> 目标文件(*.obj)
资源文件(*.rc) -- > 资源编译器(rc.exe) --> 资源文件(*.res)
目标文件 + 资源文件 + 静态库(*.lib) --> 链接器(link.exe) --> 可执行文件(*.exe) / 静态库(*.lib) / 动态库(*.dll)


二、WIN32核心库

1. 动态库

Windows系统自带,在C:\WINDOWS\system32目录下:
user32.dll – 窗口、消息、资源等APIs
gdi32.dll – 绘图相关APIs
kernel32.dll – 进程、线程、内存管理等内核APIs

VS安装目录下包含对应的导入库,导入库存放函数名和序号的对应,通过序号去找 dll 中函数地址:
user32.lib --> user32.dll 的导入库
gdi32.lib --> gdi32.dll 的导入库
kernel32.lib --> kernel32.dll 的导入库

在这里插入图片描述
Win32工程会默认包含这三个导入库
在这里插入图片描述

2. 头文件

windows.h – 所有windows头文件的集合,已包含下面的头文件

windef.h – windows数据类型
winuser.h – user32.dll 的 APIs
wingdi.h – gdi32.dll 的 APIs
winbase.h – kernel32.dll 的 APIs
winnt.h – UNICODE字符集支持


三、入口函数

入口函数说明如下:

int APIENTRY wWinMain(									// PASCAL调用,被调用者负责清理堆栈
					 _In_ HINSTANCE hInstance,			// 当前程序的实例句柄,是内存对象的唯一表示,并非指针
                     _In_opt_ HINSTANCE hPrevInstance,	// 当前程序的前一个实例句柄,Win32已废弃,总为NULL
                     _In_ LPWSTR    lpCmdLine,			// 命令行参数字符串
                     _In_ int       nCmdShow)			// 窗口显示方式,最大化/最小化/正常
{
    
    // 函数体代码: 
}

1. 调用约定

windef.h 中定义了如下调用约定宏,都是PASCAL调用,被调用者负责清理堆栈

#define WINAPI __stdcall
#define APIENTRY __stdcall
#define CALLBACK __stdcall
#define PASCAL __stdcall

如果是 C调用(缺省),则调用者负责清理堆栈

#define WINAPIV __cdecl

差异:
1、相对于PASCAL调用,C调用 在多次调用同一个函数的情况下,内容相同的清栈代码会重复出现,编译生成的二进制模块会比较大;
2、带有变边参数表的函数,如 printf / scanf,只能使用C调用约定,应为参数个数不确定,编译器无法在被调用者中生成清栈代码;
3、无论PASCAL调用,还是C调用,参数入栈的顺序都是从右往左;
但对于 C++ 的类成员函数,最后一个入栈的是 this 指针,相当于第一个参数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33659478/article/details/115052644

智能推荐

Flink入门(一)(Java和scala)_微瞰技术的博客-程序员秘密

Flink批处理从文件中读取单词,计算频次Scala版本import org.apache.flink.api.scala.ExecutionEnvironmentobject BatchWordCountJob { def main(args: Array[String]) { val env = ExecutionEnvironment.getExecutionEnvi...

matlab容差,matlab_山和蓝枝的博客-程序员秘密

使用R2015a,这个问题最终得到了一个简单的答案(详情请参阅我对这个问题的其他答案 )。 对于R2015a之前的版本,有一个内置的(未记录的)函数: _mergesimpts 。 对名称组成的安全猜测是“合并相似点”。使用以下语法调用该函数:xMerged = builtin('_mergesimpts',x,tol,[type])数据阵列x是N-by-D ,其中N是点数, D是维数。 每...

TCP选项:SO_LINGER和TCP_DEFER_ACCEPT_s651665496的博客-程序员秘密

SO_LINGER选项:typedef struct linger {       u_short l_onoff;    //开关,零或者非零       u_short l_linger;   //优雅关闭最长时限 } linger; 当调用closesocket关闭套接字时,SO_LINGER将决定系统如何处理残存在套接字发送队列中的数据。处理方式无非两种:丢弃或

v-bind绑定style时css属性名的写法(驼峰和短横线)_lzh~的博客-程序员秘密

我们可以利用v-bind:style来绑定一些CSS内联样式。在写CSS属性名的时候,比如font-size我们可以使用驼峰式 (camelCase) fontSize或短横线分隔 (kebab-case,记得用单引号括起来) ‘font-size’<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</tit.

线程处理函数pthread_cleanup_push / pthread_cleanup_pop_ONIM的博客-程序员秘密

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:    1)调用pthread_exit。    2)作为对取消线程请求(p

HttpWebRequest 提示 “基础连接已关闭:发送时发生意外错误” 的解决方法_httpwebrequest 基础连接已经关闭: 发送时发生错误_Our sky的博客-程序员秘密

HttpWebRequest 多次请求不同网站时,由于安全协议问题。提示错误 “The underlying connection was closed: An unexpected error occurred on a send.”(基础连接已关闭:发送时发生意外错误)记录解决方法//.net 4.0 设置: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;//.net 4.5 设置: ServicePointMa

随便推点

图像分割算法详解_sa算法实现图像分割_dong24k的博客-程序员秘密

图像分割边缘检测边缘检测的基本步骤是:平滑滤波:由于梯度计算容易受到噪声的影响,因此第一步是用滤波去除噪声。但是,降低噪声的平滑能力越强,边界强度的损失就越大。锐化滤波:为了检测边界,必须确定某点领域中灰度的变化。锐化操作加强了存在有意义的灰度局部变化位置的像素点。边缘判定:在图像中存在许多梯度不为零的点,但是对于特定应用,不是所有点都有意义。这就要求操作者根据具体情况选择和去除处理点,具体的方法包括二值化处理和过零检测等。边缘连接:将间断的边缘连接成为有意义的完整边缘,同时去除

服务器TIME_WAIT和CLOSE_WAIT区别及解决方案,TCP的三次握手四次挥手详解_t-io close-wait_诺浅的博客-程序员秘密

服务器TIME_WAIT和CLOSE_WAIT区别及解决方案:http://itindex.net/detail/50213-%E6%9C%8D%E5%8A%A1%E5%99%A8-time_wait-close_wait具体的代码方面解决CLOSE_WAIT方案:http://blog.csdn.net/shootyou/article/details/6615051

基于FFMPEG采集摄像头图像编码MP4视频+时间水印_ffmpeg 时间水印_IT_阿水的博客-程序员秘密

FFMPEG采集摄像头数据编码MP4视频+时间水印操作系统:Ubuntu18.04ffmpeg版本:ffmpeg4.2.5摄像头:电脑自带或USB免驱摄像头水印处理:avfilter图像渲染:SDL库

用autoruns揪出流氓软件的驱动保护_weixin_33712881的博客-程序员秘密

用autoruns揪出流氓软件的驱动保护一、为什么流氓软件总是删不掉? 经常有网友发贴子说文件删除不掉,或者流氓软件清除不了,或者删除了相关的文件,但是马上它又出现了。现在流氓软件为了保护自己,采取的手段是五花八门,无所不用其极:进程保护,交叉感染,自启动,自我恢复,文件隐藏,进程注入,驱动保护。在我的上一篇文章中《[惊天大发现]顽固文件删除终极武器》已经告诉大家如...

js 获取上周开始结束时间 上月开始结束时间 本月开始结束时间_bossxu_的博客-程序员秘密

//获得某月的天数 function getMonthDays(myMonth){ var monthStartDate = new Date(nowYear, myMonth, 1); var monthEndDate = new Date(nowYear, myMonth + 1, 1); ...

C++优先队列详解_weixin_34387468的博客-程序员秘密

C++优先队列详解标签(空格分隔): ACM STL 优先队列 priority_queue优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 百度百科上这样描述的:   优先级队列 是不同于先进先出队列的另一种队列。每次从队列...

推荐文章

热门文章

相关标签