大数跨境
0
0

曾经想去的二三四五,曾经想娶的女子......

曾经想去的二三四五,曾经想娶的女子...... CppGuide
2021-07-22
2

仅以此文献给有一定基础的 C/C++ 想学好 Windows 编程的读者。

我本科学的地理专业,没错就是培养高中地理老师的那个地理专业,当时凭个人兴趣,自学了 Web 开发和 Flash 编程。虽然选修了 C 语言,但只能写出一些黑洞洞的控制台程序,特别好奇像 QQ、360 这种桌面程序是怎么写出来的。

直到大四毕业前夕,我遇到了两本书,这两本改变了我的人生轨迹。

一、我的工作经历

毕业以后,我非 Windows C/C++ 工作不做,最后得偿所愿。先后做过股票交易系统的客户端,类似这种:


是不是看起来挺复杂的?掌握了原理,其实一点不复杂。

我为了帮助大家学习,写了一个简易的股票客户端程序,现在开源出来给大家学习:

  
  
  
👆打开关注
回复「股票源码」即可获取源码

通俗地说,Windows 有界面的程序的基本原理是:

步骤一:注册窗口类;

步骤二:利用窗口类创建窗口;

步骤三:进入消息循环队列,触发 Windows 消息处理各个消息。

后来我去二三四五继续做 Windows C/C++ 开发,参与的项目是二三四五的战略软件的开发。所谓战略软件是二三四五不以盈利为目的的几款口碑比较好的软件,如好压、看图王、王牌浏览器、二三四五输入法。

那个时候,还给自己 PS 了一个章鱼头像:

如果你对这些软件背后的原理很感兴趣,可以看下金山卫士的源码或者紫光拼音输入法的源码,它们都开源了,我整理了一套可以直接编译、运行、调试的版本,分享一下:

金山卫士

源码获取:

 
 
 
👆打开关注
回复「金山卫士」即可获取源码


紫光拼音输入法


紫光拼音输入法开源的确在我意料之外的。

源码地址:

https://github.com/balloonwj/unispim

二、学习方法

就我个人而已,我接触 Windows 编程,已经十多个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究 Windows 程序上了,工作以后一直做到 PC 端开发负责人。

我很庆幸我当初学习 Windows 程序走了一条正确的路线:

先是学习常用的 Windows 程序原理和基本 API,再学习的 MFC、WTL 等一些常用的框架和类库,同时看了大量 Windows 项目的源码,如金山卫士的开源代码、Filezilla、电驴源码等等。

个人觉得,基础真的很重要,拿 Windows 开发来说,当你掌握了 Windows 程序的基本原理,我列一下大致范围:

  1. Windows 消息机制(消息如何产生、如何发送、如何处理,常见的消息有哪些、消息的优先级、如何自定义消息、窗体消息、常用控件消息)

  2. GDI 原理(要熟悉 GDI 的各种对象,如画笔、画刷、字体、区域、裁剪、位图等,熟悉它们的 API,熟悉各种 GDI 绘图 API、当然最好也要熟悉一整套的 GDI+ 的类,GDI 与 GDI+ 的区别)

  3. Windows 进程与线程的概念(进程的概念、如何创建、如何结束、跨进程如何通信;线程的创建与销毁、线程间的同步与资源保护,熟悉 Windows 常用的线程同步对象:临界区、事件、互斥体、信号量等)

  4. Windows 内存管理(清晰地掌握一个进程地址空间的内存分布、Windows 堆的创建与管理等)

  5. DLL 技术(DLL 的生成、变量的导出、函数的导出、类的导出、如何查看 DLL 导出哪些函数、隐式 dll 的加载、显式的 DLL 的加载、远程 DLL 注入技术等)

  6. PE 文件(一个 PE 文件的结构、有哪些节、如何修改、分别映射到进程地址空间的什么位置等)

  7. Windows SEH(结构化异常处理)

  8. Windows Socket 编程

  9. Windows 读写文件技术(像 CreateFile、WriteFile、GetFileSize 等这些API应该熟练掌握、内存映射技术)

当然很多必备的技术也不好归类到 Windows 技术下面,比如 Socket 编程,这涉及到很多网络的知识,例如 TCP 的三次握手、数据的收发等,还有就是各种字符编码的知识以及之间的相互转换,又比如一系列的 CRT 函数及其对应的宽字符版本。

我在知乎上专门开了一个 live 介绍 Windows 开发必知必会的技术,有兴趣的可以戳这里:

https://www.zhihu.com/lives/909740192015998976


当然如果你搞 Windows 开发,一定要熟悉开发工具 Visual Studio,熟悉其工程项目的大多数属性配置,而且要做到知其然也知其所以然。

如果不是不能跨平台,我敢说 Visual Studio 是史上最好最强大的开发工具,没有之一!

我现在的主业已经不再是 Windows 开发了,目前主要从事服务端开发,但 Windows 的很多设计思想真的很好,非常值得借鉴,而且从编码风格来说,虽然看起来有点怪异,但是非常规范和易懂。

有了基础知识,你可以轻松地对工作中的一些问题给出解决方案,也能轻松阅读和使用市面上的那些库,比如,如果你深刻理解 Windows GDI,你不会在一个群里大喊,duilib 某个属性为什么不起作用,你可以直接去阅读它的画法代码,如果是 bug 你可以改 bug,如果只是你使用错误,你可以了解到正确的使用方法。

所以基础这个东西,在短时间内,可能让你看不出与其他人的差别,但是从长远来看,它决定着你在技术之路上攀多高、走多远。套用侯捷先生的一句话:勿在浮沙筑高台。

三、推荐的书籍

如果你对 Windows C/C++ 编程感兴趣,我推荐两本书:

1.《Windows 程序设计》

这本书讲述了 Windows UI 相关原理的方方面面,且语言朴实、娓娓道来,犹如一位良师益友,我当初也是看这本书进入 Windows C/C++ 开发领域的;这本书的业界地位很高,可以说这本书是中国的老一代 Windows 程序员的启蒙和进阶读物。


2. 《Windows 核心编程》



这本书正好与上一本相互弥补,讲述的是 Windows 非 UI 部分的运行原理,内容非常丰富,当之“核心”二字无愧,图书的作者是编写 Windows Sysinternals 套件的 Jeffrey Richter,如果你没听说过 Windows Sysinternals 套件,那你一定听说过 Process Explorer:

侯捷老师评价这本书是“搞 Windows 开发,需要两样资源,一是 MSDN,一本就是《Windows 核心编程》”,这本书口碑非常好,多次重印,每一版都有一些新的改动和惊喜。这本书你不要指望一下子就能读懂每一个章节,这本书的很多章节其实非常难懂的,比如 SEH 章节、自旋锁相关章节。随着你对 Windows 程序的原理的不断深入可以回过头来翻这本书,你会发现当初看的懵懵懂懂的文字,竟然都是金玉良言,所以这本书要带在身边,经常翻一翻。

 
 
 
👆打开关注
回复「Windows开发」即可上述图书pdf版


最后,祝每一位读者都能得偿所愿!


【声明】内容源于网络
0
0
CppGuide
专注于高质量高性能C++开发,站点:cppguide.cn
内容 1260
粉丝 0
CppGuide 专注于高质量高性能C++开发,站点:cppguide.cn
总阅读582
粉丝0
内容1.3k