目录
C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlC++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html Windows下用C++开发软件,主要包含两大类,一类是工具软件与客户端软件的开发,一类是服务器程序的开发(运行在Windows Server服务器上)。我们日常工作学习使用的都是Windows桌面系统,会频繁地使用到各式各样的工具与客户端软件。本文详细介绍一下Windows平台下用C++开发应用软件的诸多内容,以供大家借鉴或参考。
1、引言
在Windows系统中,大多数客户端软件都是用C++开发的,当然也有少部分软件是用C#等语言实现的。我们日常使用的Windows桌面版的QQ、微信、腾讯会议、企业微信、字节飞书、阿里钉钉、百度网盘、迅雷、Chrome浏览器、Foxmail邮箱、远程软件向日葵/ToDesk等客户端软件,都是用C++开发实现的,C++是当前Windows平台开发应用软件的主流开发语言。本文详细介绍一下Windows平台下用C++开发客户端软件的相关内容。
2、IDE 开发环境介绍
Windows中常用的C/C++ IDE开发工具主要有微软的Visual Studio和QT公司的QT Creator。当然也可以使用微软的VSCode、JetBrains公司的CLion,甚至使用代码编辑查看工具Source Insight(只能查看编辑,不能编译)去开发代码。这里我们重点介绍一下Visual Studio和QT Creator这两个IDE。
2.1、Visual Studio
微软的Visual Studio是Windows平台上最强大的IDE软件开发工具,支持开发C/C++、C#、F#、JavaScript、Python、TypeScript、Visual Basic、.NET等语言的应用程序。这里我们主要看C/C++应用程序的开发。
Visual Studio有强大的代码编辑与调试功能,发展到今天已经经理了多个版本的迭代。从经典的Visual Studio 6.0,到Visual Studio 2003、Visual Studio 2008、Visual Studio 2010、Visual Studio 2012、Visual Studio 2015,再到近几年的Visual Studio 2017、Visual Studio 2019、Visual Studio 2022。
其中,Visual Studio 2010是比较经典的版本,这个版本比较稳定且使用流畅,很多公司都在用这个版本,但该版本距今已经有10多年了,很多开源的C/C++代码已经不再支持。比如著名的WebRTC库最低只支持到Visual Studio 2017,已经不再支持Visual Studio 2010了。很多公司为了使用新版本的开源库,为保持库与库之间开发工具的统一,已经将Visual Studio的版本升级到2017及以上的版本了。
新版本有新版本的优势,新版本引入了很多新功能,比如Visual Studio 2019的16.9版本开始就引入了Google的内存检测利器Address Sanitizer,这个工具非常强大,可以检测最让C/C++程序员头疼的内存异常问题。
Linux有专用的内存检测工具Valgrind和Address Sanitizer,但Windows只有一些老旧的工具,对新版本的Visual Studio已经不再支持了,Visual Studio 2019引入了内存检测利器Address Sanitizer是个很大的利好消息。
AddressSanitizer是Google提供的一款面向C/C++语言的强大内存错误检测工具,该工具原先只支持Linux,现在也可以在Windows上使用了。微软在Visual Studio 2019的16.9版本们引入了强大的内存分析工具AddressSanitizer,在安装Visual Studio 2019的16.9版本及以后的版本时,会默认安装AddressSanitizer工具的:
对于如何在VS中如何使用AddressSanitizer内存分析工具,可以看一下微软官方文章的详细说明:
在Visual Studio中使用AddressSanitizerhttps://docs.microsoft.com/zh-cn/cpp/sanitizers/asan?view=msvc-170至于AddressSanitizer的详细说明,可以参见google官方页面:
https://github.com/google/sanitizers/wiki/AddressSanitizerhttps://github.com/google/sanitizers/wiki/AddressSanitizer 推荐大家使用Visual Studio 2019或者以上的版本,Visual Studio 2017不太好用,在使用过程中会时不时的卡顿,在调试大型程序时速度也很慢很卡,而Visual Studio 2019要好很多。
虽然从Visual Studio 2019的16.9版本开始支持AddressSanitizer,但据说支持的还不够全面,感兴趣的朋友可以去尝试使用一下。
此外,Visual Studio 2017之前的版本都是收费的,当然大家用的基本都是破解版的,从Visual Studio 2017开始,开始提供免费的社区版本(Commuity Version),我们使用社区版本就可以了,完全可以满足需求的。下载安装都比较方便,直接搜索,到官网下载社区版安装就行了。
基本上大多数Windows UI客户端程序都是用Visual Studio开发编译的。使用C/C++开发的常用客户端程序有腾讯会议、QQ、PC版微信、阿里钉钉、字节飞书等,他们都是用Visual Studio开发编译的。
此外,不同版本的Visual Studio,其对应的运行时库是不同的,发布软件包时需要将对应版本的C/C++运行时库带上。关于C/C++运行时库及Windows通用运行时库的详细介绍,可以查看我之前写的专题文章:
C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享https://blog.csdn.net/chenlycly/article/details/139094024 之前根据多年的项目实践,专门写文章分享过Visual Studio的高效调试技巧与调试方法,文章链接如下:
Visual Studio调试技巧与实用方法总结(实战经验分享)https://blog.csdn.net/chenlycly/article/details/124884225
2.2、Qt Creator
Qt Creator是Qt为应用程序开发人员提供的一个跨平台集成开发环境,可运行于Windows、Linux和MacOS操作系统( Qt Creator是跨平台的)。使用Qt Creator开发的应用程序可以部署到电脑、嵌入式、移动操作系统或Web浏览器中。
在功能方面,Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、图形化的 GDB 调试前端,集成 qmake 构建工具等。开发基于QT界面库的C/C++应用程序时,我们一般都用QT Creator来开发。因为QT界面库是跨平台的,所以如果要开发一套既支持Windows系统有支持Linux系统的桌面应用软件,一般会选择使用QT界面库,会使用QT Creator开发环境去开发。
Linux主要是用作服务器系统的,为什么还要支持Linux系统呢?因为现在国家正在推行国产化进程,实现国产化替代,会使用到麒麟、UOS和深度DeepIn等国产化桌面操作系统,这些系统都是基于开源的Linux系统开发而来的(本质上都属于Linux系统)。很多软件需要支持国产化操作系统(推出支持国产化系统的软件版本),后面支持Linux的应用程序也会越来越多了。
比如视频监控头部厂商海康威视和大华的客户端软件,为了既支持Windows也支持Linux,均选择了QT进行开发。随着国产化进程的持续推进,国产化操作系统的逐步普及,支持函国产化系统的软件会越来越多,QT也会变得越来越受欢迎,QT开发技术开始变得火热起来。各大招聘网站上关于QT开发的岗位也越来越多了。
3、 C++语言特性
做C/C++开发,首先要掌握C/C++语言基础,基础部分的内容这里就不赘述了,这里重点讲讲一些常用的或者较新的C++语言特性。
3.1、熟悉泛型编程
要熟悉泛型编程,即熟悉模板函数和模板类,在实际项目中很多时候会用到,C++标准库中的大多数类都是用模板实现的(比如STL容器类)。
3.2、了解C/C++异常处理
需要了解C语言SEH结构化异常捕获__try...__except,也要会用C++的try...catch去捕获异常,特别是在使用COM组件时需要使用到try...catch,防止使用COM组件时出现异常,导致程序发生崩溃闪退。可以捕获到代码或函数中异常,只是当前功能不能正常的完成,但不会因为异常引发程序发生崩溃。
关于使用_try...__except和try...catch的实例,可以查看我的文章:
使用__try...__except和try...catch捕获异常实例分享(附源码)https://blog.csdn.net/chenlycly/article/details/125331752
3.3、熟练使用STL容器
C++标准库给我们提供的STL容器及相关的算法函数,给我们编程带来了很大的便利。常用的STL容器有vector、list、map、set等,有了这些STL容器,我们基本不用去设计各种复杂的数据结构,这些STL容器可能就能很好地满足我们的需求。
使用STL库提供的算法函数去高效快速地操作STL列表中的数据,比如搜索容器中满足条件的数据,对容器中的数据进行排序等。常见的算法函数有sort、count_if、find_if、remove_copy_if等,使用这些算法函数比我们直接去遍历STL容器,速度要快很多的,我们在项目中多次用到。之前也写了相关的文章,感兴趣的话,可以去查看:
如何使用C++ STL标准模板库中的算法函数(附源码)https://blog.csdn.net/chenlycly/article/details/139591764使用STL算法函数有效提升STL列表的搜索速度(附源码)https://blog.csdn.net/chenlycly/article/details/139591809
3.4、熟悉C++11新特性
C++11新特性很重要,作为C++开发人员很有必要去了解去学习,不仅笔试面试时会涉及到(大部分C++招聘岗位在面试时都会问到C++11的新特性),而且开源代码中也在大规模的使用。
以很多视频会议及直播软件都在使用的开源WebRTC项目为例,WebRTC代码中大篇幅地使用了C++11及以上的新特性,要读懂其源码,必须要了解这些C++的新特性。此外在日常项目代码中,也会用到一些C++11的新特性,比如一些常用的关键字(比如auto、override、final、nullptr、=delete等)、lamda表达式(匿名函数)、智能指针(unique_ptr、shared_ptr和weak_ptr)等。之前我也写了C++11新特性的文章,感兴趣也可以去看一下:
C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解https://blog.csdn.net/chenlycly/article/details/130918547C++11 新特性 ① | C++11 常用关键字实战详解https://blog.csdn.net/chenlycly/article/details/132701306C++11 新特性 ② | 左值、左值引用、右值与右值引用https://blog.csdn.net/chenlycly/article/details/132746812C++11 新特性 ③ | 可变参数模板介绍https://blog.csdn.net/chenlycly/article/details/132768378C++11 新特性 ④ | 模板类 std::function 和标准库函数 std::bindhttps://blog.csdn.net/chenlycly/article/details/132774379C++11 新特性 ⑤ | 仿函数与 lambda 表达式https://blog.csdn.net/chenlycly/article/details/132776343 当然我们可能还需要了解C++14、C++17,甚至是C++20的新特性,特别是在阅读开源代码时可能会涉及到,开源代码特别热衷于使用这些新特性。
这些C++新特性,可以让代码更简洁、更高效,但也让C++变得更加臃肿复杂,更难于驾驭!
4、Windows 平台的编程技术与调试技能
作为Windows C++应用软件开发人员,需要掌握动态库编程、Socket网络编程、多线程编程、数据库编程等主要编程技术。此外,还要掌握一些C++软件调试与异常排查的技能,去高效快速地排查软件运行运行过程中遇到的各种问题。
4.1、需要掌握的若干编程技术和基础知识
做Windows C++应用软件开发,主要会涉及到两大块,一个是业务开发,一个UI界面编程,这里面会涉及到多方面的编程技术,这些编程技术在日常的项目中可能会用到。比如动态链接库编程、数据库编程、Socket网络编程、多线程编程(多线程创建及多线程间的通信)、多进程编程(进程间的通信)、UI界面编程等。其中,UI界面编程需要熟悉常见的UI界面库,比如微软的MFC库、开源的duilib库、跨平台的QT库、Chromium UI界面库等。一般根据项目的需要,掌握一到两个界面库就可以了,后面会对这些界面库做个大概的介绍。
另外,还要掌握一些常用的设计模式,比如单例模式、工厂模式、观察者模式等。还要学习和熟悉一些常用的C/C++开源库的使用,比如jsoncpp、TinyXML、libcurl、sqlite、duilib、libwebsockets、sdl、muduo、boost等。
此外,现在的软件系统都是基于网络的,通信数据需要经过网络传输,所以还需要掌握一些基础的网络知识,可以抓包分析多种网络故障和网络数据通信的异常。在和Linux服务器通信和调试业务时,可能需要通过Linux命令去查看服务器及服务器程序的运行状态,所以可能需要掌握一些常用的Linux命令。
关于网络基础知识及网络问题排查实战,可以查看我的文章:
【网络入门】详解常用的基础网络知识(面试笔试常考内容)https://blog.csdn.net/chenlycly/article/details/124433936【网络进阶】网络问题排查实例集锦(实战经验分享)https://blog.csdn.net/chenlycly/article/details/124643918 对于C/C++开发的入门者,可以查看我之前写的《C/C++学习路线》:
C/C++学习路线总结与分享https://blog.csdn.net/chenlycly/article/details/127191075
4.2、需要掌握的软件调试技能
考察一个开发人员的水平,一方面要看其编码与设计能力,另一方面要看其软件调试能力(排查软件异常的技能)。所以,软件调试能力也非常重要,作为一个合格的进阶开发人员,系统地掌握C++软件调试技能去高效地处理各种软件异常问题很有必要!
首先要熟练使用IDE开发工具,掌握IDE工具的常用调试技巧与方法。对于Visual Studio的常用调试方法与技能,可以查看我的文章:
Visual Studio调试技巧与实用方法总结(实战经验分享)https://blog.csdn.net/chenlycly/article/details/124884225 然后要系统地掌握C++软件调试与异常排查的技能。比如要了解引发C++软件异常的常见原因,要掌握排查C++软件异常的常用方法。要熟练使用多个软件工具去分析排查各种软件问题,比如SPY++(查看窗口属性)、Dpendency Walker(查看模块的依赖关系)、GDIView(排查GDI对象泄露)、Process Explorer(排查高CPU占用等)、Process Monitor(监测文件活动和注册表活动)、API Minitor(监测程序对API函数的调用)、Windbg调试器(分析软件异常卡死或崩溃:静态分析dump文件和动态调试目标进程)、IDA反汇编工具(查看二进制文件的汇编代码)等。可以通过项目实战分析案例去学习软件调试与异常排查所涉及到的具体知识点与细节,并把这些技能积极主动地应用到项目实战中去。
对于引发C++软件异常的常见原因,我之前根据项目实战做过详细的总结,可以查看文章:
引发C++软件异常的常见原因分析与总结(实战经验分享)https://blog.csdn.net/chenlycly/article/details/124996473 对于排查C++软件异常的常用方法,我之前根据项目实战也做过详细的总结,可以查看文章:
排查C++软件异常的常见思路与方法(实战经验总结)https://blog.csdn.net/chenlycly/article/details/120629327 通过线上沟通交流及对身边同事的观察发现,很多C++开发人员在软件调试及异常排查方面都比较欠缺,甚至有时会直接影响工作效率和项目进度!为了解决这一普遍存在的痛点问题,推出了一套成体系的《C++软件调试与异常排查从入门到精通》精品技术专栏!专栏中的内容均来自项目实战,是实战经验总结,有很强的实战参考价值!欢迎大家订阅该精品专栏!
C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
该精品技术专栏的订阅量已达到450多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!
5、开发 Windows 应用软件需要具备的其他技能
在Windows平台上开发应用软件,除了上面讲到的编程及调试技能之外,我们还需要了解Windows窗口特性与窗口编程(了解Windows窗口风格、窗口消息机制以及窗口绘制机制)、了解Windows系统及特性(了解exe程序的启动过程、Windows文件系统和Windows特性)、了解字符编码(比如Unicode、ANSI和utf8等)、熟悉IDE开发工具的各种工程属性配置、熟悉常用的Windows API函数、学会使用多个软件工具去分析各种软件问题(比如SPY++、Dpendency Walker、Process Explorer、Process Monitor、Windbg等)等,具体说明如下所示:
1)要了解并会操作Windows窗口:比如窗口的创建与显示、窗口的Z序、窗口的最大化与最小化显示、窗口的前置与置顶、修改窗口风格(Style)、父子窗口及兄弟窗口的关系、获取窗口的信息、通过信息查找窗口等。
2)要了解窗口的消息机制:熟悉常见的Windows标准窗口消息,可以给窗口发送消息,需要时可以拦截窗口的消息。
3)要了解窗口的绘制机制:要会使用GDI和GDI+加载图片、绘制窗口,这里面会涉及到双缓冲绘图。4)了解常用窗口的创建与常用控件的使用:了解对话框、菜单、工具栏和状态栏的创建与使用,了解Button按钮、Edit编辑框、ComboBox组合框、Text文本框、list列表、Progress进度条等常用控件的使用。
5)要了解IDE中工程属性的配置:通过对属性的配置实现对主程序或模块的编译选项控制。
6)要了解常见的字符编码:比如ANSI编码、UNICODE编码、UTF8编码、中文GBK编码,以及这些字符编码之间的转换。在支持多语言的时候肯定会涉及到,一般UI界面的字符串使用UNICODE编码,和服务器通信的数据中的字符串使用UTF8编码。
7)要了解Windows exe程序的启动过程:便于分析软件启动过程中遇到的各种异常问题。
8)要了解Windows文件系统和系统特性:比如系统路径和常见应用程序路径、UAC权限(管理员权限与标准用户权限等)、常见第三方软件的注入行为等。
9)要熟悉Windows常用API函数:学会使用API函数去实现诸多的功能。要学会使用微软MSDN,到MSDN上去查看API函数的详细说明,比如API函数的参数说明、使用注意细节以及API函数示例代码等。
10)要熟练使用多个软件工具去分析排查各种软件问题:比如SPY++(查看窗口属性)、Dpendency Walker(查看模块的依赖关系)、GDIView(排查GDI对象泄露)、Process Explorer(排查高CPU占用等)、Process Monitor(监测文件活动和注册表活动)、API Minitor(监测程序对API函数的调用)、Windbg调试器(分析软件异常卡死或崩溃:静态分析dump文件和动态调试目标进程)、IDA反汇编工具(查看二进制文件的汇编代码)等。借助这些分析工具,可以高效排查和解决项目中遇到的问题。对于非崩溃问题,可以尝试使用上述小工具分析;对于崩溃问题,则使用Windbg调试器分析。有包含异常上下文信息的dump文件,则用Windbg静态分析;没有dump文件的,则用Windbg调试目标进程。
关于这些常用工具的详细介绍,可以查看我之前写的两篇文章:
C++软件开发值得推荐的十大高效软件分析工具https://blog.csdn.net/chenlycly/article/details/135431130C++ 软件常用分析工具及项目实战问题分析案例集锦https://blog.csdn.net/chenlycly/article/details/135431130
上述要点中的技能,是需要通过不断的编码调试实践获取的,不是一蹴而就的,是一个不断实践、不断积累的过程。
作为一名软件开发人员,应当通过实践和学习,不断提升自己的技术水平,以适应不断变化的技术环境和项目需求。
在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)
专栏1:(该精品技术专栏的订阅量已达到490多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)
C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!
专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:
C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795
常用的C++软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!
专栏3: (本专栏文章已经更新到220多篇,还在持续更新中,欢迎订阅)
C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
专栏4:
VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/124272585
将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。
专栏5:
Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.html
根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。
6、客户端 UI 编程技术
客户端软件一方面要将业务数据加载到UI界面上展现出来,另一方面要提供业务操作的入口,所以客户端软件在实现时主要包含UI界面开发和软件业务开发两大块。不同公司的产品业务会有很大的不同,此处我们不讨论具体的业务,只讨论比较共性的UI编程技术。软件UI界面编程,就是根据软件的需求和UI设计师的UI设计效果去实现软件的UI界面,并将业务数据展现在UI界面上,这一实现过程中需要用到一些常用的UI界面库。
常用的C++ UI界面库主要有Visual Studio自带的MFC界面库,基于directui思想的开源duilib界面库,支持跨平台的QT界面库以及Chromium浏览器的UI界面库,当然还有一些收费的界面库,收费的界面库不在本文的讨论之列。其中,MFC库和duilib库是基于Windows窗口设计的,只能用于Windows C++客户端软件的开发;QT是跨平台的,既能用于Windnows客户端开发,也能用于Linux客户端的开发。Windows上C++软件的开发主要使用Visual Studio开发环境,如果用到QT,一般使用专用的QT Creator开发环境。
此外,最近几年逐渐火起来的开源跨平台应用程序开发框架Electron和Flutter,也受到了很多公司的青睐,在不少软件中得到了应用。下面我们简单介绍一下Electron框架的内容,至于Flutter框架,属于移动开发领域的,已经超出我负责的范畴,在此就不做介绍了。
6.1、MFC 库
MFC是微软的IDE开发环境Visual Studio自带的界面库,原生的MFC界面比较简陋,界面效果很一般。MFC是个很古老的库,虽然Visual Studio更新了很多代,但MFC库始终维持在多年前的效果上,基本没有做任何升级和改进。
平时我们使用MFC库去开发一些小的工具软件,会很方便,通过简单的可视化拖拽控件的操作,既可构建出软件的界面,不需要额外的去做界面,直接使用MFC就完全能满足要求。但对于一些商业软件,原生的MFC库是没法满足要求的,如果要用MFC开发软件界面,则需要继承MFC库中的控件类,重写这些控件类的方法去重绘界面并进行贴图美化,但要实现比较酷炫的界面效果,使用MFC去实现就会很吃力了。
对于MFC库,还有个比较大的问题,每个控件都是一个窗口(比如Static文本控件、按钮控件等),都需要单独绘制处理,每个窗口都会占用一定数量的GDI对象。如果软件中打开的窗口比较多,这个软件占用GDI对象总数会比较多。特别是IM聊天软件,每个聊天窗口会占用一两百个GDI对象,在做极限测试时,打开几十聊天窗口,这样软件进程占用的GDI对象总数就会接近或达到1万上限,就会导致GDI绘图出现异常,导致程序发生闪退。
现在的商业软件基本都不再使用MFC了,但有个行业除外。很多炒股类软件的客户端(比如大智慧客户端软件)还在用MFC库,炒股软件的界面主要来显示股票数据,对界面的美化效果没有大的要求,使用MFC库做一些基本的美化即可。
6.2、duilib 库
duilib库是基于directui思想实现的UI界面库,相对于MFC,要灵活、好用很多,可以较容易地去实现一些酷炫的界面效果。很多知名的公司都在使用该库,比如ZOOM视频会议客户端、PC版微信、爱奇艺PPS客户端、京东咚咚客户端、百度网盘客户端、酷我音乐、酷狗音乐、华为PC版手机助手等。有些中小型公司也在使用该界面库,比如2345公司的好压等产品。
很多公司在开源的duilib库的基础上,根据产品和项目的需要,对duilib库进行了大量的改进和优化,并增加了一些新功能。网易和腾讯都开源了各自基于duilib改进而来的界面库,原生的duilib我们使用过,但腾讯和网易的开源版本没有研究过,不知道效果如何,不知道相对于原生的duilib都做了哪些改进。回头有时间的时候可以去研究一下。
6.3、QT 库
QT是一套支持跨平台的界面库,既支持Windows平台,也支持Linux平台,甚至支持移动平台。如果要开发Linux系统中的客户端软件,则需要使用QT界面库。随着国产化系统的推行与普及,很多软件既要支持在Windows上运行,也要支持在国产化Linux桌面系统上运行。
有些厂商为了实现对Windows和Linux双平台的支持,直接选择使用QT界面库开发客户端软件,而不再选择Windows用Windows专用界面库开发、Linux用QT开发的方式。比如视频监控大型厂商海康威视和浙江大华,他们的视频监控客户端软件都是直接采用QT界面库开发的。很多做人工智能的公司都选择QT进行应用软件的开发。
近年来在国产化大潮的推动下,QT的支持者和使用者越来越多,QT开发也变得越来越火,招聘市场上对QT开发人员的需求也越来越大,很多大公司的软件也在选择使用QT开发。QT当前的火爆场面,在几年前是不曾有过的。
关于QT界面库的由来与发展,以及QT的详细介绍,可以查看我的文章:
6.4、Chromium 开源浏览器的 UI 库
Chromium是Google的一个久负盛名的浏览器C++开源项目,它是Google的Chrome浏览器背后的引擎(几乎包含了Chrome浏览器的所有实现代码),其目的是为了创建一个安全、稳定和快速的通用浏览器。
很多浏览器使用的都是Chromium开源内核,比如微软Win10系统中推出的Edge浏览器抛弃了IE内核,转而使用Chromium内核。国内知名的360浏览器、QQ浏览器、傲游浏览器,它们用的都是Chromium内核:
只是开发了各自的UI皮肤和界面,增加了一些额外的用户功能。接下来说到的CEF嵌入式浏览器框架也是基于Chromium内核实现的。
除了浏览器使用到了开源Chromium的内核,很多Windows应用软件也使用到了Chromium中的内容,使用到了Chromium中的UI组件。比如字节的飞书客户端、阿里的钉钉客户端、华为的WeLink客户端、网易云音乐与有道云笔记,均使用到了Chromium中的UI组件。
那如何去判断一个客户端软件是否使用了Chromium浏览器的UI组件了呢?其实很简单,可以使用Visual Studio自带的SPY++工具,去探测一下这些软件的窗口属性,如果窗口的标题和类名中看到了Chrome的字样,就基本能确定软件的界面就是用Chromium的UI组件开发的。比如下图中的Chrome Legacy Window和Chrome_RenderWidgetHostHWND字符串:
6.5、Electron 界面框架
Electron是一个由OpenJS基金会和活跃的贡献者社区维护的开源项目。Electron 基于Node.js和Chromium,是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序的框架,被Atom编辑器和许多其他应用程序使用。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。
QQ今年发布基于全新的跨平台解决方案QQNT架构,该架构主要采用了Electron 技术,QQ首次实现了Window、macOS、Linux多个系统平台之间QQ架构的统一:
与此同时,QQ变得更稳定,更流程,更便于维护。关于 QQ NT 全新架构的更详细说明,可以参考文章:
QQ 用 Electron 重构后,终实现 Linux、macOS、Windows 三端架构的统一!https://blog.csdn.net/csdnsevenn/article/details/131566192 之前听说Electron框架很耗资源,比如会占用大量的内存资源,程序运行会变慢,总之Electron框架比较难驾驭,对技术要求比较高,开发控制成本比较高。字节跳动的飞书,几年前使用的就是Electron框架,但后来又退回到Chromium开源UI框架。之前接入我们SDK的客户,也在使用Electron开发客户端软件。因为我们没使用过Electron,对Electron框架知之甚少,在此就不做深入的介绍了。
腾讯客户端工程师对大家比较关注的一些Electron问题进行了解答:
大家印象中都觉得Electron会很笨重,很占资源。Electron框架,确实一般的公司很难驾驭的,腾讯应该做了深度优化和改进,特别是资源占用方面!
7、项目中常用的 C/C++ 开源库介绍
在Windows C++应用软件项目中,会使用到很多C++开源库,比如:
1)处理json的jsoncpp库(json串的构建与解析)。
2)处理xml的TinyXML库(XML串的构建与解析)。
3)支持SMTP/HTTP/HTTPS等多协议网络传输开源库libcurl库(使用SMTP协议发送邮件、使用HTTP/HTTPS发起HTTP请求)。
4)处理文件压缩与解压缩的zip.cpp和unzip.cpp(支持文件的压缩与解压)。
5)二维码生成库libqr(生成二维码图片)。
6)png图片处理库libpng(读写png图片)。
7)图片读取解析库stb_image(图片读取与解析)。
8)实现websocket通信的libwebsockets库(客户端与服务器之间进行websoket通信)。
9)轻量级开源数据库SQLite(存放本地数据)。
10)多媒体处理开源库FFmpeg(包含音视频采集与编码、音视频解码、视频格式转换、视频抓图、给视频加水印等功能)。
11)实时音视频处理开源库WebRTC(包含音视频采集、编码、网络传输,解码显示等)。12)Chromium嵌入式框架开源库CEF(嵌入浏览器控件)。
13)跨平台多媒体开发库SDL库(音视频采集、编码、解码显示等)。
14)数据实时压缩解压库zlib(对字节流数据进行实时的压缩与解压缩)。
15)异常捕获库CrashRpt/CrashPad(捕获软件运行过程中的异常)。
16)开源操作系统ReactOS(查看系统源码,可作为Windows系统代码实现的参考,有时能可以通过查看系统函数的实现去辅助解决问题)。
17)网络通信库boost、muduo和libevent等。
8、Windows 平台实用小工具介绍
对于代码查看编辑工具,除了重量级的IDE开发工具之外,还可以使用微软的VSCode和Source Dynamics公司的Source Insight。此外,在日常工作中推荐大家使用Notepad++和Everything这两个轻量级的实用工具,使用起来非常方便、高效。
8.1、代码编辑器 VSCode
Visual Studio Code,简称VSCode是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台代码编辑器。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。
该编辑器也集成了所有一款现代编辑器所应该具备的特性,包括语法高亮(syntax hight lighting),可定制的热键绑定(customizable keyboard bindings),括号匹配(bracket matching)以及代码片段收集(snippets)。还会拥有对 Git 的开箱即用的支持。
VS Code将代码编辑器的简单性与开发人员对其核心 edit - build - debug 周期所需的功能结合在一起。它提供了全面的代码编辑、导航和理解支持、以及轻量级调试,丰富的可扩展性模型以及与现有工具的轻量级集成。此外,微软在大力推广VS Code,其更新的频率很快,每月更新一次,其中包含新功能和错误修复。
严格意义上讲,VS Code只是个代码查看和编辑工具,本身不提供编译器,没法对代码进行编译。如果要编译代码,则需要安装相关的插件。
8.2、代码查看编辑器 Source Insight
Source Insight是一个面向项目开发的轻量级程序编辑器和代码浏览器,它拥有内置的对C/C++、C#和Java等程序的分析。能分析代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。Source Insight提供了最快速的对代码的导航和任何程序编辑器的源信息。
Source Insight是个小巧轻便的工具,可以快速启动,实用过程中占用很少的资源(CPU和内存资源),可以快速地浏览和编辑代码,和大型臃肿的IDE软件相比,这些都是很大的优势。作为一个编辑器,是没有编译代码的功能的。
在查看学习大型开源库代码时,强烈建议大家使用Source Insight,比如大型开源项目WebRtc和Chromium。这些大型代码的大小就占到了数个GB以上,且很多这种大型的开源库都是通过交叉编译工具编译的,并没有提供Visual Studio工程文件,不好使用Visual Studio去查看代码。这时正好可以使用Source Insight,只要在Source Insight创建一个工程,将开源代码的根目录指定到工程中即可。
关于如何使用Source Insight工具,如何创建Source Insight工程,可以查看我之前写的一篇文章:
使用Source Insight查看编辑代码https://blog.csdn.net/chenlycly/article/details/124347857
8.3、文本编辑器 Notepad++
Notepad++是程序员必备的文本编辑器,该软件软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。Notepad++支持C、C++、Java、C#、XML、HTML、PHP、JS等27种编程语言。该工具比Windows系统自带的记事本(Notepad.exe)要强大太多,可完美地取代Windows系统的记事本。
可以使用Notepad++查看代码,它支持语法高亮显示。Notepad++支持多标签页,可以同时打开多个文件。我们经常使用Notepad++查看日志文件,支持在文件中搜索,可以对匹配到的关键字的次数进行计数,并将搜到的记录显示出来,可以切换查看,这对查看软件运行日志非常方便。还可以使用Notepad++记录文本内容,该工具启动快使用便捷,这是其一大优势。这是我们日常开发工作中用的最多的软件之一。
8.4、文件搜索工具 Everything
Everything是voidtools开发的一款文件搜索工具,它体积小巧,启动迅速,界面简洁易用。搜索文件时快速建立索引,快速搜索,同时占用极低的系统资源,还能实时跟踪文件变化。其搜索速度比Windows自带的搜索要快得多。
使用该工具在搜索磁盘上的文件或文档时,不是一般的好用,搜索速度真的非常快,强烈推荐大家使用。
9、最后
本文概括性地介绍了Windows C++ 应用软件开发相关的内容,希望能给Windows C++开发人员,特别是入门级的新人,提供一些借鉴或参考。