1.Windows编程初探

一、前言

所谓系统编程,其实主要的过程就是学习系统提供的各种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索引,大致可以分为以下几个大方向:

  1. 用户界面与桌面
  2. 图形和游戏
  3. 音频和视频
  4. 数字访问和存储
  5. 设备
  6. 网络
  7. 安全
  8. 诊断
  9. 程序安装
  10. 系统服务

而这些大方向下还有许多小功能,每个小功能下便是实现该小功能的各种win API。

由于其设计到的方向实在是太多了,所以本系列文章只会讲解一些常见的功能与用法。

而其中主要的还是讲解如何学习使用win api,让你能够达到举一反三的效果。

三、编程入门

想要进行win api编程,最简单的方法就是安装Visual Studio

安装过程就不再赘述了,只是注意安装后一定要安装下图组件:

image-20240323202908428

它是你能在vs中调用win api的基础。

至于更多编程细节、C/C++基础内容,请参考系列文章:初识C++

对于C/C++的语法细节,本系列不会过多的讲述。

安装完成后,新建一个项目,包含头文件Windows.h后,就能进行win api编程了:

image-20240323203326419

比如上图中,我就调用了一个非常简单的win API,名字为MessageBoxA,这个函数就是windows系统提供给我们使用的api,只要调用它,就能够弹出一个消息框,就像上图中我们看到的那样。

对于这些win api其实我们只关注两件事:

  1. 它需要哪些参数
  2. 它的作用是什么

而一般情况下,我们都是先知道第二点,也就是我们想要实现某个功能,就会去浏览器中搜索实现这个功能的win api名字是什么。

但很多情况下,想要实现某个功能不是一个win api就能够实现的,其往往需要数个api相互配合才能完成某个功能。

比如现在我们想要知道如何能让自己的代码中弹出一个消息框,那么第一步你就应该去浏览器中搜索:win api 弹出消息框。

然后你大概率就会看到MessageBoxAMessageBoxW这两个函数、乃至看到MessageBox这个宏。

这种以AW结尾的函数在win api中是非常常见的,这和编码有关,如果不理解可以参考文章:编码

简单来说就是以A结尾的一旦需要字符串参数,那就需要窄字符集的,而W结尾则需要宽字符集的字符串。

一般存在A、W大写字母结尾的函数,那么一般就会对应一个没有A、W字母结尾的宏,它会根据当前项目的配置自动选择调用哪一个函数。

这便是这三者之间的关系,所以在这种情况下,你可以直接在浏览器中搜索MessageBoxA这个函数即可,一般就能很快找到官方文档,也就是Microsoft

image-20240323210942522

然后点进去,你就能看到这个函数中各个参数的用法。

同时注意这些参数:

image-20240323211203173

一般会分为三个部分:

  1. 第一部分就是[]中的内容,这这是一个简单的标识,代表这个参数是入参(in)、还是出参(out)、或者是可选的(optional),实际写代码时可以直接忽略这一项。
  2. 第二部分才是各个参数真正的类型,比如HWND,只不过这些都是windows自定义的类型,实际上HWND就是一个void*而已,在vs中你是可以直接右键它看其实际定义的,所以无需太多担心。
  3. 第三部分则是各个参数的名字,一般都是见名知意的,比如lp表示指针、Text表示文本,合起来其实也就是填入消息框的文本字符串内容。

然后你就可以挨个看这些函数的各种用法。

但最好的入门方式其实并不是看官方文档,而是直接去相关的博客,看别人的调用方式,然后我们复制下来、运行没问题后,再参考官方文档、手动修改参数达到我们想要的效果。

最后就是要注意使用该函数的要求:

image-20240323211850866

这些win api都是分散在各种头文件、dll文件中的。

不过一般来说,Windows.h这个头文件已经包含了绝大多数的头文件,所以一般我们只需要包含这一个头文件即可。

所以最主要的是看后面的静态库、动态库,由于User32库一般是自动包含进我们程序中的,所以看到这个库我们不用理会,这些自动链接的库其实是可以在项目配置中看到的:

image-20240323212259746

可以看到,除了这个lib外,还有很多其它的lib也被自动链接了。

但这些你都无需记忆,如果你发现当你运行代码、报错无法链接某某函数时,一般就是因为你没有将相应的库链接进来,更详细的用法可以参考文章:动态库与静态库

四、简单总结

本文主要是简单介绍了一下windows系统编程的基本逻辑,无非就是调用各种win api而已。

其中主要的难点其实还是理解各种win api所涉及到的概念,对于单一功能的win api是非常简单的,比如前文提到的MessageBoxA就是一个相对独立、功能单一的api,使用起来非常简单。

重点还是在理解一般情况下,我们使用一个win api的学习过程,这一点非常重要。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux