程序员随笔(6)

来源:互联网 发布:甲乙丙丁过桥 算法 编辑:程序博客网 时间:2024/05/17 02:43

    Windows,那是一扇通向计算机世界的重要窗户。Windows程序开发者,在多年前,他们红红火火,人数众多,他们制作一些通用的个人软件,他们拥有软件开发的全部。多年后的今天,物是人非,一切都成昨日黄花,他们凤毛麟角,他们为上层应用提供Windows平台的积木,他们被遗望在程序开发的一角。
    首先,我不认为编写ERP上层业务软件的是Windows开发人员(有些是流程Coder,有些是可能数据库专家,或者架构设计师),因为他们甚至无需知道Windows DLL基本原理,照样能“出色”的完成工作,并成为公司的香喷喷。作为一个过时的Windows程序员,我说话是不是有些酸溜溜?实际上,我还是很清楚的,随着计算机软件领域分工的不断细化。同是开发者,在你办公室与你一板之隔的另一侧,完全有可能会发出你完全不能理解的声音。我要学会去接受。
    如果你对Windows开发一点儿兴趣都没有,或是试图从下面的描述掌握一些具体的Windows开发技术,请跳过此文,因为,我既不是什么Windows开发高手,更不愿意成为你宝贵时间的杀手。以下,权当练练五笔,呵呵。

[基础知识]
    Windows:顾名思义,窗户,而实际上:Windows也确实由窗所成,你所能见到的一切都是窗或其饰物。有些窗可能没有轮廓,有些窗的怪状可能有些奇怪。并且它们还可能互相嵌套(里面的称为子窗)。但是,记住,它都是窗。它有生命,但拜你所赐。当你按你所需创建它,赋于它生命的第一刻起,它就开始在它的不同生命阶段发出消息回馈于你,而你可契此机加入指令去控制它的外形及行为(是不是有些象纯面向过程的开发?),套句时髦的话,它是消息驱动地。如果你认为这都还不够,你可以再放个闹钟,让它准时向你汇报。除了这些自发的固定消息,只要它获有焦点,它也接受电脑外设(鼠标、键盘和其它)的主动操作,而一一对应具体的消息。为了方便,窗上扩展了菜单,操作变为点菜一样方便快捷。
    有一种常见的特殊窗:称为对话框,它在没有生命时,就可以在其上定制若干接受输入输出的小窗(称为各种类型的子窗,如文本框),这可以通过Windows资源来生成,而象搭积木一样来定制界面(无需编码),当它有生命时,由Windows来解析将其变为所需显示(这也是一些RAD开发工具的可视开发的基础)。它由用途不同,分为模态和非模态。
    窗每个都有自已的标志(窗口句柄),通过系统或自定义消息可以方便的进行通讯。或是通过剪贴板也行(剪贴板为全局,可跨程序/进程)。
    窗除了接收输入,最重要的当然是输出展现了,它的内容区可以绘制图形或文字。Windows为此提供了多种画笔(GDI资源)、画布、调色板。还有字库。另外,为了软件国际化,Windows API大都支持Unicode版(只需简单预定义即可切换)。绘图时,为了方便编辑,你也可以通图元文件来记录你的动作而非图形,实际上:打印输出的原始数据就是这些指令(图元)而非图形,然后再由打印驱动生成图形的。
    以上这些,可以通过很多书上讲到的那个Windows生生死死的程序(用VC的IDE向导也可得到),依次全部扩展一遍,逐个实验之。一切细节皆在Windows程序设计一书中。最重要的应该是Windows(以及子窗)的各种消息触发时机及顺序。而比较难理解的是:窗体的映射模式(原理不难,但很难记住,容易让人头晕,反正我是,呵),无关位图的传送、调色板。后两个内容可以看看,但无需掌握。因为现有的硬件配置及新的绘图方式(GDI+ .NET的AVALO)。使其不再具有可用性。
 
[高级技术]
    以上,我认为是是基础,展现的是Windows的花拳绣腿。当然,如果你要制作高级界面,可能要费些周折。但成败的关键是美术修养而非技术。在实际工作中,以上只是必要条件,并非充分。比如:你可能需要编写在支持并发的通讯协议处理程序,本机监控/日志服务程序,简单的多线程压力测试软件,跨语言的通用功能模块(COM),可重用于脚本的控件(ActiveX Control)….
    好了,要完成上述工作,那就需要了解Windows更多的东西。
    首先:什么是Windows的EXE、 DLL、 COM、 ActiveX Control。。。?呵,地球人都知道。再问一句:它们之间的联系和区别?@#$#@$?....  需要吗?需要知道吗?
    正所谓,见多不怪,知道多一点总没坏处,或许你了解之后,你会发现你打开了多年的心结。去了解每一种文件的结构及运行机制吧。当你学会使用DumpBin,学会查看那输出的一行行文字,你将不再害怕资源管理器里成堆范滥的神密的文件(注意:组件注册和运行方式,你也许没法从Windows书藉中找到。那是一个很大的话题。你现在只需要知道组件会有几个固定输出函数即可,而在输出节里你会见到它们)。有人说:Windows中除了消息机制外,最后果要的技术就是DLL技术。当你拿到一个Dll文件时,你不要再会为其后缀所迷惑,通过自已的双手验证它(注意:MFC为我们带来了四不像的扩展DLL)。
     线程/进程间通讯及内存分配是一个经常碰到问题,当你用剪贴板进行通讯时,显然这个应用的通讯并不重要,或者说不要求精确。当你追求准确无误,高效的即时通讯时,了解一下Windows的内存管理方式(注意不同Windows版本会有所不同),了解一下进程、线程、系统内核对象。你可以简单的用内存映射文件在进程间共享数据,而加入系统同步对象来进行同步。或者其它手段,一切都将变得随心所欲,视需要而定。对了,实际上DLL的加载机制也需要通过Windows的虚拟内存管理机制来理解,否则你无法确定的你的数据区是被如何处理,代码是如何动态共享的。而更进一步,Com内的数据呢?千万不要在猜测中写出不由自已控制其命运的代码。
    好了,不得不再重提一下窗的消息,它是可以跨线程/进程的,神奇吧?其实一点儿都不神奇,因为它的消息循环只有一个,不存在同步问题。但如果要传递引用的数据块时,那就要小心了,你的数据块可在本进程进址空间内,呵呵。看看剪贴板的处理方式。而新增的OLE剪贴板确实很神奇(我们先不管它内部的OLE机理),它为我们编程带来方便,特别是要实现看拟神奇的拖放操作时。还要注意一点:在看Windows的一些底层实现机制时,可能会发现一些于我们应用开发是有借鉴意义的地方,比如:物理存储页的实现之Copy-On-Write方式。
    上述讲到应该算是Windows的高级开发技术了。它能搞定工作中的绝大多数。但仍有例外:比如我现在正在使用的中文输入程序,我的窗口右下角的那个防火墙软件,我的金山词霸软件。。。。或者说你的外行朋友哪天突然问你游戏外挂是怎么回事?你或许不会去写,但你总不愿被外行问得哑口无言(骗也要骗他几句,呵呵)。
    Windows提供多种消息的挂钩机制:挂住键盘消息,你就可以控制键盘,而实现输入法了。挂住鼠标,你自然就可以实现金山词霸的跟踪取词了。另外:DLL提供挂接方式:结合一点内核对象的继承知识,将你的程序挂入现有的游戏程序,传送你希望的数据给服务器,或是挂住键盘来实现一个简单机器人来为你练功,这也算是简单的游戏外挂了吧。挂住通讯的Socket DLL,你就可以截取网络的输入输出,实现一个简单的防火墙了。。。。所以,Windows已经为你提供了钥匙,当然,你需要更多的专业领域知识,去完成这些非常规的开发。具体做法,讲起来很晦涩,牵扯太多,很难几句讲明。可以参考Windows核心编程,然后结合一些网上的短小的精验技巧文档。提醒一下,如果你对Windows核心不熟悉,而直接去看所谓的技巧,只会增加你对其的敬畏。
     记得有本书(叫什么高手的)讲过:编程的高级境界之一是写驱动程序。这人显然比较还老。对于驱动程序的 编写,一直鲜有市场。而现在,它快变成老古董了。当然,那并不是不能完成的任务,它需要你对Windows汇编熟悉(硬件的中断机理有了解)。使用落后的DDK工具,万分小心的调试你的并不大的程序,因为一不小心,你就可能让你的电脑完蛋。所以,它所需要知识点是偏,不不是博。其实,早些年前一个著名的病毒:CIH,就是一个驱动程序。Windows给设备驱动程序预留编程接口,直接访问硬件是可能并且可行的,只不过大多数情况下,你对此偏门知识并不感兴趣。
    我有个朋友是软件下载狂,当我要找某个软件的注册码或是注册机时,都是找他。大多数情况都能得偿所愿。但很少想过注册机是如何制作的。前不久简单翻看了一两本书,发现这需要你对各种文件格式有相当了解,特别是Windows的PE文件结构,然后需要加密知识,这样,无论你压缩或是脱壳,可辅助一些已成型的工具,然后,你就可以写出简单的注册机了。呵呵(当然,如果压缩是做在驱动里,那你能会比较费劲了)。一些软件狗或硬件狗,杀毒软件,同样涉及的是以上技术。

[其它]
     讲完了吗?我觉得差不多了,但可能有人还会说出一大堆:游戏编程,网络编程、数据库编程。。。这些我认为是专业领域的应用,或者是后来的扩展(扩展是说不完的),可归结不同编程接口(DLL或是Com)的使用,有时,需要快速开发一些涉及相关领域的程序,而简单使用这些接口,但对其专业领域知识不甚了了。可能对项目来说是立竿见影,但这显然不利于其长期维护和扩展。所以,最好将其划归专用领域知识。如果你认为你会使用Win Socket DLL就成了网络编程高手,会用ADO Com就成了数据库专家,会使用DirectX Com就成了游戏编程能手,那就太搞笑了(就好像以前有位同事老问我,如何使用VC的向导生成ATL Com,然后他认为:他已经会写就会ATL了)。不过,这其实也不可笑,因为:在很多非Windows开发人员心目中:Windows是就是一个大盒子,里面杂乱的的装了成堆API 小甜饼 & 大量COM 烤鸡腿。Oh, My god,
     OLE/COM/ActiveX呢?噢,这应该是最让许多人开心又头疼的东东。我即使不喝酒,想多了也会头疼。所以,还是改天再聊吧。

石头 于2005-07-09
<未完>

原创粉丝点击