一、前言
所谓系统编程,其实主要的过程就是学习系统提供的各种api、以及理解与系统功能相关的各种概念而已。
目前各大操作系统主要还是使用的C/C++代码书写,因此其提供的可供我们调用的接口依旧还是以C/C++为主。
但这并不意味着只能使用C/C++,事实上其它很多语言依旧可以进行系统编程、调用系统提供的api。
比如C#中你就可以通过一些方式去主动调用win api,rust中甚至官方提供了一个可以直接让我们进行调用的crate
。
只不过相比于其它语言,C/C++调用win api是最简单的,你只需要安装到VS,然后勾选C/C++开发组件,就能够直接包含windows头文件、调用win api使用。
二、总览win api
windows系统提供的功能是相当丰富的,其官方文档为Win32 API 的编程参考。
但说实话,如果你没有一定的C/C++基础、乃至基本的win api开发经验,大概率是看不懂它的文档的,
所以本系列文章的目的就是带大家大致过一遍win api所涉及的各种方向的使用方法。
按其官方提供的api索引,大致可以分为以下几个大方向:
- 用户界面与桌面
- 图形和游戏
- 音频和视频
- 数字访问和存储
- 设备
- 网络
- 安全
- 诊断
- 程序安装
- 系统服务
而这些大方向下还有许多小功能,每个小功能下便是实现该小功能的各种win API。
由于其设计到的方向实在是太多了,所以本系列文章只会讲解一些常见的功能与用法。
而其中主要的还是讲解如何学习使用win api,让你能够达到举一反三的效果。
三、编程入门
想要进行win api编程,最简单的方法就是安装Visual Studio。
安装过程就不再赘述了,只是注意安装后一定要安装下图组件:
它是你能在vs中调用win api的基础。
至于更多编程细节、C/C++基础内容,请参考系列文章:初识C++。
对于C/C++的语法细节,本系列不会过多的讲述。
安装完成后,新建一个项目,包含头文件Windows.h
后,就能进行win api编程了:
比如上图中,我就调用了一个非常简单的win API,名字为MessageBoxA
,这个函数就是windows系统提供给我们使用的api,只要调用它,就能够弹出一个消息框,就像上图中我们看到的那样。
对于这些win api其实我们只关注两件事:
- 它需要哪些参数
- 它的作用是什么
而一般情况下,我们都是先知道第二点,也就是我们想要实现某个功能,就会去浏览器中搜索实现这个功能的win api名字是什么。
但很多情况下,想要实现某个功能不是一个win api就能够实现的,其往往需要数个api相互配合才能完成某个功能。
比如现在我们想要知道如何能让自己的代码中弹出一个消息框,那么第一步你就应该去浏览器中搜索:win api 弹出消息框。
然后你大概率就会看到MessageBoxA
与MessageBoxW
这两个函数、乃至看到MessageBox
这个宏。
这种以A
、W
结尾的函数在win api中是非常常见的,这和编码有关,如果不理解可以参考文章:编码。
简单来说就是以A
结尾的一旦需要字符串参数,那就需要窄字符集的,而W
结尾则需要宽字符集的字符串。
一般存在A、W大写字母结尾的函数,那么一般就会对应一个没有A、W字母结尾的宏,它会根据当前项目的配置自动选择调用哪一个函数。
这便是这三者之间的关系,所以在这种情况下,你可以直接在浏览器中搜索MessageBoxA
这个函数即可,一般就能很快找到官方文档,也就是Microsoft
:
然后点进去,你就能看到这个函数中各个参数的用法。
同时注意这些参数:
一般会分为三个部分:
- 第一部分就是
[]
中的内容,这这是一个简单的标识,代表这个参数是入参(in)、还是出参(out)、或者是可选的(optional),实际写代码时可以直接忽略这一项。 - 第二部分才是各个参数真正的类型,比如
HWND
,只不过这些都是windows自定义的类型,实际上HWND
就是一个void*
而已,在vs中你是可以直接右键它看其实际定义的,所以无需太多担心。 - 第三部分则是各个参数的名字,一般都是见名知意的,比如
lp
表示指针、Text
表示文本,合起来其实也就是填入消息框的文本字符串内容。
然后你就可以挨个看这些函数的各种用法。
但最好的入门方式其实并不是看官方文档,而是直接去相关的博客,看别人的调用方式,然后我们复制下来、运行没问题后,再参考官方文档、手动修改参数达到我们想要的效果。
最后就是要注意使用该函数的要求:
这些win api都是分散在各种头文件、dll文件中的。
不过一般来说,Windows.h
这个头文件已经包含了绝大多数的头文件,所以一般我们只需要包含这一个头文件即可。
所以最主要的是看后面的静态库、动态库,由于User32
库一般是自动包含进我们程序中的,所以看到这个库我们不用理会,这些自动链接的库其实是可以在项目配置中看到的:
可以看到,除了这个lib
外,还有很多其它的lib
也被自动链接了。
但这些你都无需记忆,如果你发现当你运行代码、报错无法链接某某函数时,一般就是因为你没有将相应的库链接进来,更详细的用法可以参考文章:动态库与静态库。
四、简单总结
本文主要是简单介绍了一下windows系统编程的基本逻辑,无非就是调用各种win api而已。
其中主要的难点其实还是理解各种win api所涉及到的概念,对于单一功能的win api是非常简单的,比如前文提到的MessageBoxA
就是一个相对独立、功能单一的api,使用起来非常简单。
重点还是在理解一般情况下,我们使用一个win api的学习过程,这一点非常重要。