从第一次拖着行李入京找活,至今已工作若干年了。这些年一直追逐自己的梦想,跑过三个城市,换了三份工作,认识了很多业内的朋友。和朋友们闲聊时,发现很多人都已经不再做客户端软件了。有的转去做管理,有的转去做IOS,有的转去做安卓,有的转去做投资,“坚守”的人真的不多。曾经朋友开玩笑,说我们都是抱着微软的大腿,如果微软倒了,我们就失业了。我们说这句话时,多半是抱着戏谑的态度。时过境迁,随着移动互联网的兴起,PC的没落是难免的。相应的PC客户端没落,从业人数减少,现在想招一个合格的windows程序员已经非常难了。或许是出于一种纪念,我想起编写该系列博客,和大家讲讲windows客户端软件开发中的点点技术。让大家可以清晰了解到一款软件的诞生之旅。(转载请指明出于breaksoftware的csdn博客)

一般一款软件的诞生会经过漫长的准备过程,比如立项、调研、交互设计、UI设计等。出于介绍Windows客户端相关技术的目的,开发之前的所有步骤将一笔带过。各个模块使用的技术细节也不会进行详细的介绍,因为该系列博文侧重于介绍实现模块所有“用”到的技术。同时出于考虑该系列博文主要针希望了解Windows开发软件的同学,所以也不会使用一些复杂的技术——比如boost。但是为了不失去乐趣,我将介绍hook技术,并使用hook技术实现一些“不可思议”的功能。

以下为我将介绍的模块提纲和相关的技术:

  1. 界面。Windows之所以可以占据PC端系统大部分份额,一个很重要的原因就是其有良好的界面交互。所以windows客户端程序,一个很重要的因素便是界面。我经历过很多项目,其中界面相关的重构及开发都占据很大的比例。往往一个产品做到最后一个迭代,也是界面改动需求——say goodbye。所以这块技术非常重要。目前这块技术分为如下几种:

    • 窗口控件类型。比如我们熟知的MFC和WTL,以及在这些基础上封装的金山贝壳UI引擎等。
    • 无窗口控件类型。比如DUI和Htmlayout,以及一些对浏览器内核封装后的界面引擎。
  2. 网络。在互联网如此普及的年代,假如你的软件没有联网功能,那可能就真的out了。一般情况下,我们软件会使用到如下网络行为:
    • 上传。除了一些无良的公司会偷偷上传一些用户信息外,其中一个用到上传功能的场景是:上传崩溃分析日志。
    • 下载。下载是让软件实现更新功能的必要技术。如果一款软件失去了自更新,我一般认为它就是“僵尸”了。因为它已经失去了“重生”的机会。
    • 查询。对于一些机密算法,我们放在本地自然不合适,因为破解对高手来说是easy的。那么我们通过网络向服务器提供“物料”,让保存机密算法的服务器告知我们计算结果。

    相关技术参阅:
    《实现HTTP协议Get、Post和文件上传功能——设计和模块》
    《实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现》
    《实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现》

  3. 数据。数据的形式非常多。如果我们一旦涉及通信,便会有数据参与。比如和服务器通信,我们可能需要对数据进行加密或者hash。我们会在之后介绍如下算法的使用:
    • MD5。它是一种hash算法,之前人们一直认为该算法是唯一性很高的算法。它一般用于做数据校验。前几年中国某大学教授发现MD5可以发生碰撞,但是MD5在计算机界的地位还是无法撼动的。可以说我们日常使用的软件里,几乎都存在MD5算法。特别是一些URL请求,其中一些字段就是某些字段组织后进行MD5计算后的结果。这对做过协议破解的人来说,应该是司空见惯的。
    • AES。它是一种加密算法,它是用于取代DES算法的。
    • DES。它也是一种加密算法,但是已经out了,尽量使用AES吧。

    数据是什么格式,是CS端相互约定的。我将介绍如下两种格式的使用:

    • XML。
    • Json。

    数据如果过大,可能要压缩或者解压。这块我将介绍两种库的使用:

    • zip
    • 7z
  4. 日志打点。日志打点的作用不可小视。对于开发同学,日志可以标识程序执行的脉络,从而方便我们定位问题。对于产品交互设计同学,打点可以帮助统计一个按钮被按下多少次,是经过什么顺序被按下的,从而我们可以依据这些数据设计出更合理的交互。有时候,我们安装一款软件后,往往会有个勾选——帮助我们改进。如果你勾选了,那么这款软件就会上传这些日志打点信息。一般,每条日志,都会携带用户标志信息。对于没有账户系统的软件,用户标志一般是若干硬件信息(硬盘序列号等)组合后的结果。相关技术参阅:
    《python3编写简易统计服务器》
    《WMI技术介绍和应用——查询硬件信息》
  5. 崩溃。可能除了著名的Hello World,没有哪款著名的程序可以保证自己不崩溃。对于折腾过破电脑或者安装过很多杀软的同学来说,应该见过蓝屏是什么样子——操作系统崩溃了。连操作系统都会崩溃,更何况我们写的程序呢?所以崩溃并不可怕,可怕的是我们不能收集崩溃日志和不会分析崩溃日志。这块技术,我将讲解两个模块:
    • 崩溃日志生成。
    • 崩溃日志分析。

    相关技术参阅:
    《分析两种Dump(崩溃日志)文件生成的方法及比较》

  6. 数据库。如何一款软件,都可能试图在系统本地留点什么——老子到此一游。那软件怎么刻字,又刻在什么地方呢?简单点,写几个文件就行了。复杂点就要使用到数据库了。

以上基础的模块介绍完后,我们会插入一些有意思的技术:

  1. 进程间通信。有时候,我们需要调用其他进程来完成任务。一种可能是这款软件是我们自己写的,我们可以在软件代码内部编写进程间通信代码。另一种是这款软件只有固定的输出,我们需要接管其输出,完成单向通信。相关技术参阅:
    《进程间通信:同步双工管道》
  2. 云指令。这是一个非常有意思的主题。通过指令可配置化,我们可以像控制网页一样方便的控制客户端的行为——一般情况下,如果我们要改变客户端逻辑可能需要修改代码并发布新的版本。采用云指令后,我们只要改动服务器配置便可以轻易完成对客户端行为的改变,而不需要走漫长的发布和升级流程。相关技术参阅:
    《在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎》
    《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》
    《在windows程序中嵌入Lua脚本引擎--编写自己的Lua库》
  3. 修改别的进程的行为(入侵)。入侵可能每个技术Geek都曾尝试过的经历。为了让我们这次开发之旅变得有意思,我会在最后做个善意的“入侵”,完成一些好玩的功能。相关技术参阅:
    《使用APIHOOK实现进程隐藏》
    《VC下提前注入进程的一些方法1——远线程不带参数》
    《VC下提前注入进程的一些方法2——远线程带参数》
    《VC下提前注入进程的一些方法3——修改程序入口点》
    《VC提前注入.net软件的方法》
    《PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法》

希望经过这次旅程,大家可以对windows客户端开发技术和模块有个了解。可以借助该系列博文中的模块,快速搭建自己的应用。

VC开发Windows客户端软件之旅——前言相关推荐

  1. C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?

    桌面软件还是得win32,工具只有两个选择vc和delphi,不建议用.net,存在部署问题. 还有大佬说 桌面还是老老实实C#吧,看需求选择WPF或者Winforms 或者干脆激进一点,直接上win ...

  2. vc开发soap客户端(方式一)

    SoapSerializer SoapSerializer对象用来构建一个向Web服务发送的SOAP消息.在与服务器连接前,SoapSerializer对象必须与 SoapConnector对象连接. ...

  3. 自己开发icloud客户端软件

    开发者只要花少量时间了解下该DLL所提供的API用法,就可以轻松开发自己的软件与苹果的icloud服务端进行联系人,相片等同步.从而实现PC与iphone,ipad等终端进行联系人,相片的同步. 官方 ...

  4. 基于Qt开发PC客户端软件

    Qt 软件库用来开发PC端软件非常方便,如果有一套系统,即有服务端.移动端及PC端,那么PC端最适合用Qt来开发,设计界面所见即所得.基于C++语言高效灵活.下面基于本人之前开发的一个小软件来说说. ...

  5. create和qypt qt_pyqt 与 qt c++ 开发windows客户端程序区别

    我建议你可以从下面方面衡量你应该如何选型 1) 该客户端是否"比较复杂",也就是说代码量是否比较多,如果代码量比较多的话,反而建议你上Qt,因为Python语言代码量上去的话,还要 ...

  6. 基于VC的OPC客户端软件研究与实现

    http://wenku.baidu.com/view/9ed11c07eff9aef8941e06ed.html 转载于:https://www.cnblogs.com/-song/archive/ ...

  7. Windows客户端开发简介(一)

    在这样一个移动当道的年代,我跟大家讨论Windows客户端开发,似乎有些倚老卖老的意思了.然而我却觉得无论什么时候,Windows客户端开发其实还是有着不少实用经典的技术的.对了,确切说我是要说说Wi ...

  8. LPC1768处理器开发板下载软件的使用方法

    介绍LPC1768开发板下载软件 文章目录 前言 软件包 二.软件内选择 1.界面 2.读入数据 总结 前言 LPC1768开发板下载过程与单片机下载过程极为相似 软件包 链接:https://pan ...

  9. VS+Qt应用开发,设置软件图标Icon

    VS+Qt应用开发,设置软件图标Icon 前言 一.索然无味的默认icon图标 二.如何设置自己喜欢的icon图标? 1.选择自己喜欢的图标 2.设置可执行文件(.exe)图标 3.设置标题栏和任务栏 ...

最新文章

  1. 告诉你KVC的一切-b
  2. android圆形图形的设置
  3. boost::function_types::is_function_pointer用法的测试程序
  4. HTML默认样式表CSS属性
  5. 2020牛客暑期多校训练营(第四场)
  6. python x_PythonX
  7. 当安装软件后提示依赖没有安装时
  8. 关于大小端、位域的一些概念
  9. 面试被问,一千万个整数里面快速查找某个整数,你会怎么去做?
  10. python apache_Windows 配置 Apache Python CGI
  11. (转)UCS vs UTF-8 as Internal String Encoding
  12. 数字电路与逻辑设计(复习)
  13. 7.15周三晚8点,dotnet课堂全新起航,张善友/陈计节/刘腾飞我们一起来聊聊abp的故事...
  14. 【转】傅里叶分析之掐死教程(完整版)
  15. HOJ 12814 SIRO Challenge (状态压缩DP)
  16. win10笔记本cpu不高内存也不高但就是很卡,一个办法帮你解决!
  17. HTML学习(二):HTML基础
  18. SVM分类器中损失函数梯度求法及理解
  19. 运筹学基础(02375)-有道云笔记
  20. 添加 retweet button

热门文章

  1. Open3D DbScanClustering聚类算法
  2. 具有Python&OpenCV的本地二进制模式
  3. 深蓝学院的深度学习理论与实践课程:第四章
  4. python基础知识整理 第一节:入门记录(包含代码与执行结果)
  5. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
  6. 【神经网络】(14) MnasNet 代码复现,网络解析,附Tensorflow完整代码
  7. PCL点云特征描述与提取(4)
  8. opencv reshape函数详解
  9. 【blender教程】从头到尾全流程创建一辆吉普车
  10. 帕斯卡三角形与道路问题