一个程序员的成长的六个阶段

第一阶段

此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。

第二阶段

此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。

第三阶段

此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。

第四阶级

此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想变不过来。

第五阶级

此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。

第六阶级

此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。
此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。

每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。
要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。
现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。
但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件。

十种武器保证你的系统安全

我相信玩很多玩黑软的朋友都有这样一个问题。想安全吧,装杀毒软件,结果自己的很多黑软都被杀的光光,不装吧,又怕被病毒感染,后门等等,导致系统挂掉,硬盘也要格式化。哈哈。今天我就把我自己如何解决这些问题的方法告诉你们,既可以随心所欲的玩黑软,又不担心病毒的骚扰。
注:以下只是我个人所见。由于下面所涉及到的软件网上都有的下,再有本论坛空间有限,就不上传了,如网上有找不到的可以联系我。

1 avast4.78 [安装版]:占用内存非常小,全面监控,WEB监控不比Kaspersky6差,防火墙也不错。内存监控比较弱。

2 AVG Anti-Virus v7.5 [安装版]:占用内存非常强[尤其文本,比诺盾还强。],全面监控,WEB监控不行。内存监控比较强。

3 Dr.Web V4.33 [绿色版]:大蜘蛛占用内存非常小,内存监控强,查杀能力非常强。

4 Virus Chaser [绿色版]:驱逐舰占用内存非常小,内存监控非常强,查壳能力非常强。注意,如果开启内存监控,他所疑视文件会被锁定,只有结束它的进程后重起机器才可以。[做辅助查杀非常不错]

5 Kaspersky6 [绿色版]:无监控,占用内存非常小,查杀能力强。[做辅助查杀非常不错]

6 AVG Anti-Spyware 7.5 [绿色版]:启发式监控,占用内存非常小,查杀能力强。[做辅助查杀非常不错]

7 F-Prot Antivirus v3.16F [绿色版]:冰岛占用内存非常小,无监控,用内存非常小,查杀能力比较强。[做辅助查杀非常不错]

8 卡巴斯基防火墙 [绿色版]:操纵明了,自定义规则能力非常强,可防御冲击波等病毒。但与AVAST4.78自带的防火墙功能冲突,导致AVAST自带的防火墙功能不能运行,不过AVAST那些功能正好是 卡巴斯基防火墙 的本职功能,正好拟补。[怕麻烦的别用这个,哈哈。]

9 360safe3.0 [绿色版]:最后一个就是这个了,不是叫你找流氓软件啊,而是它有个非常好用的功能,就是他的 注册表 监视功能。如有更改,它会提示你操纵。再通过它的其他功能一目了然的了解所有动作。[推荐使用]

10 影子系统 [安装版]:这个是我最后推荐的,如果你看后觉得装杀毒还是麻烦,或者说我根本就不想装,再者说,你要本机测试木马病毒等,那我隆重推荐你使用影子系统,安装简单,一路下一步,最后重起机器就OK了,启动机器时会在启动项里有[进入影子系统单一模式:这个模式是只保护你的系统盘][进入影子系统完全模式:这个模式是保护你硬盘所有分区],你也可以跳过这个,在桌面的快捷方式启动影子系统。用影子系统的好处是:1单一模式(保护系统盘),你的所有操纵都是建立在系统盘上的,本机测试木马病毒等时所有都是要写进系统的,重起机器后所有操纵都会被还原,即使是木马,病毒都会消失!如果你有需要保存的软件等,不要保存在系统盘,请存放在其他未被保护的盘,这样才不会被还原。2完全模式(保护硬盘所有分区)即使你中了硬盘炸弹,重起机器后你的硬盘还是安然无恙。3还原能力经本人测试,远远超过还原精灵和还原卡。我用影子

软件开发入门学习的个人看法

踏实

   偶然在网上看到《由C#风潮想起的-给初学编程者的忠告》一文. 其中一个角度:避免“浮躁”,倡导“踏实”的学习方法,我是很认同的,但总觉该文作者标题“-给初学编程者的忠告”太大,所以在其文列出的一些具体的“操作方法”上我认为可以探讨,如同自己在某次公司总结会上就《软件开发,我们积累的是什么?》为题跟同事聊了半个多小时后,其中一个同事提到希望我能继续把这个题目细化,就刚入行的他们具体该如何发展有更“具操作性”的指引,当时我是跟他们说这只是我在这一行呆了5年多的体会,谈“指引”还太远,只是可以提出来大家思考、讨论。
  
不要过度贬低编码

   不要真的认为"不少大师级的计算机技术研究者是不懂编程的",做软件开发编码是最最基础的东西,只有踏踏实实的掌握好这个基础你才有办法往上走,不管做分析做设计做项目管理你都需要能清楚东西是如何实现的?可不可以实现?否则肯定出现大量的:"设计是设计,编码是编码","产品都是代码人员从头到尾实现的","究竟需花多少时间,难度有多大,开发人员说了算","质量/成本/进度全是黑匣子"...现象,如果你是做编码那编码就更重要了:).所以对于有志从事这个行业(软件开发)的个人来说,必须先从"重视编码"开始.过了这一关才能去考虑做系统分析,做项目管理...
   软件开发的各个环节是相辅相承的,分析有分析的重要,设计有设计的重要,编码有编码的重要,测试实施也各有其地位,任何一个环节搞不好就如同我们熟悉的木桶理论,"最薄弱的一个环节制约着其总容量".
   既然编码重要,那该如何学编码?
  
专心学好一门语言
   算算自己用过的语言也不少(括弧里为使用该语言写的比较有代表性的东东),C(dos版的图像/图标编辑工具,96年的《电脑报》有介绍),C++(可自定义方块形状的方块游戏,被收录于99年《软件》杂志的附送光盘上),汇编(DOS汉字系统,97年底完成),PB(学校自动排课/排考模块,98年),ASP(一套web版的企业信息系统,99年),VB(企业信息系统的核心组件,99年),delphi(工作流平台,组件式GIS系统等),Java(Delphi Client + J2EE Server协同实现),.Net(规则引擎),PHH...
   看起来好象也不少,回过头来想想自己真正认真学过的语言只有一个,就是“C”, Dos年代的TC2.0,用它写了大量的小程序,比较系统的了解了编程是怎么一回事,记得那个时候看到什么软件都要琢磨它是如何实现的?如果让我来实现该如何做?也模仿了不少东西,虽然多是很表面的模仿但对自己编程思维的锻炼很有好处.后来用其它语言基本上都只是翻翻帮助,然后找找其Demo代码来看看,很快就可进入状态.
   语言都是差不多的,重要的是“编码的思想”,具备了该思想语言就只是工具了,用什么工具实现都差不多,该思想的形成是需要“磨练”的,就是“专心使用一门语言”来磨练(甚至需要有“咬文嚼字的孔已己作风”),然后可“一理通百理通”,不然你只是浮于表面的去学再多的语言都没有.都不能拿来做真正的开发.都不能了解“编码”的内涵.
   如在今年招聘面试的时候看到太多写着什么语言都精通(或熟练)的毕业生,我惯用的方法是给他(她)一张纸一支笔,让他(她)用自己最了解的语言写一个算阶乘的函数,这个问题你一看肯定说很简单,好,接着我会往下问,可以有多少种方法来实现:循环,递归…还有吗?你能写出多少种来?(代码基本结构模式的考察).代码质量如何? 有没有考虑错误处理(太多人写的代码会进入死循环比如输入的是负数) ? int的上限是多少,用long? 如果输入值比较大,算得出结果吗,该如何去实现可以计算很大数的该函数?...看着他(她)写出来的代码一个个问题的问就得了,不管你用什么语言,不管你“精通”多少种语言,我只问这些用什么语言来解决问题都需要的基础的东西, 就是“编码的思想”.
  在学专一门语言的基础上新东西当然要跟,不然在这个行业你是很难“混下去”的,但有这“学专一门”的前提后,你跟起来就轻松了,而不用总是得“追”~
  在“专”一门语言的过程中为解决问题你会发现“算法”很重要,这就是接下来要说的“基础”了.

基础很重要
   面试的时候我一般都会问,基础知识学得如何? 一般重点问的是:《数据结构》, 《编译原理》, 《数据库原理》的内容.至于《由》文提到的:《汇编语言》,《 Windows 程序设计》我是不会问的.这些是可以进一步学习的东西,但对现在的开发来说不是必须的.《软件工程》我向来不问,教材理论跟实际差得太远了~
  《数据结构》很重要,不懂数据结构很多编码就是“蛮干”,而且往往把“简单问题复杂化”,甚至复杂到不可能解决.认真学习《数据结构》并多做尝试用你熟悉的语言去实现里面的算法,你会发觉“世界真奇妙”~不要认为你不会去开发“编程语言”不需要学习《编译原理》, 《编译原理》里面包含了太多开发软件的“奇妙”的思想案例,认真体会你肯定会被其解决问题的方法折服,从中你能体会到很多东西,对以后做软件(不管是设计还是编码等)大有帮助,里面有很多现存的方法可用在你的项目中,而这些跟《数据结构》是互为补充的.在这些基础上接下来《设计模式》一书你也一定得看看.
   很多应用都离不开数据库,最终总得找个地方来“操纵,存储,分析数据”,关于范式,关于锁,关于SQL,关于笛卡儿那一套你总得了解了解,不然无法入手,这就需要好好学习《数据库原理》了.单纯知道几条SQL语句是远远不够的,如何保证数据的完整性,安全性?如何提高效率等等都需要这些基础的支持~
   当然英文也是基础,看英文资料确实重要,不单是书,还有网络上的大量资料,论坛…看的时候别害怕就是了,毕竟都是受过高等教育的,英语也学了那么多年起码都有点底吧,配合这两个工具:《金山词霸》及Google.com,不懂的单词“即指即译”,但很多名词或基础知识不是靠单词解释能清楚的,配合搜索引擎查查相关资料看看,记住一点,看到不懂的东西多看几遍,默记一小会,日积月累你能看懂的东西就多了。
  
兴趣
   最后该说说的就是兴趣问题,如果你能对它真正感兴趣(如果要从事软件开发又没兴趣的话赶紧先培养兴趣去^_^),对看技术资料就想别人看武侠小说看球赛一样的话,再配合上面提到的几点(踏实, 先专后广, 基础扎实)相信在这一行多少是可以做点东西出来的~~

移动存储安全


当你的U盘,移动硬盘遗失了,被盗了,或者是遗忘在公共场所,里面的资料就会完全被别人窥探,如果涉及一些隐私,机密,那后果是很严重的。本课题就是在这样一个情况下产生的。这里剖析的只是一个最初的演示原型,详细设计,以及一些细节可以参考源代码。源代码在WinXP,VC6.0编译通过。

[代码性质] VC完整应用程序代码
[文件大小] 16K
[下载]     下载文件Jeffrey_mss.rar (15.78 KB , 下载:17次)

摘要:实现对移动存储设备的加密,保护信息隐蔽,防止隐私泄露。


关键字:移动存储设备加密安全


  当你的U盘,移动硬盘遗失了,被盗了,或者是遗忘在公共场所,里面的资料就会完全被别人窥探,如果涉及一些隐私,机密,那后果是很严重的。本课题就是在这样一个情况下产生的。这里剖析的只是一个最初的演示原型,详细设计,以及一些细节可以参考源代码。源代码在WinXPVC6.0编译通过。


1
、访问注册表读取计算机上的移动存储设备

在注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum

下面可以看到计算机当前的状态,这里可以看到所有的存储设备的情况,包括计算机的硬盘,通过情况下,名称为0的是计算机硬盘,所以在列出的选择设备时,会把名称为0的屏蔽,不然太危险,一旦造成系统的破坏,后果会很麻烦。对注册表的读写:

HKEY hkey;
char sz[256];
DWORD dwtype,sl = 256; 
for(int i=1;i<8;i++)
{
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\
               NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
        {
               CString id;
               id.Format("%d",i);
               if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
               {
                       CString str=(CString)sz;
                       m_select.AddString(sz);
               }
        }
}
RegCloseKey(hkey); 


2
、对磁盘的扇区的操作

  Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOSBIOS中断等等),其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。对于磁盘扇区的读写,可以通过C++CreateFile()函数来实现。由MSDN可查询到该函数原型:

HANDLE CreateFile(
LPCTSTR lpFileName, 
DWORD dwDesiredAccess, 
DWORD dwShareMode, 
LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
DWORD dwCreationDisposition, 
DWORD dwFlagsAndAttributes, 
HANDLE hTemplateFile );


由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。

使用的时候,如果需要定位到某一个具体的扇区,可以使用SetFilePointer()函数:

DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);


  在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。

int ReadDisk(CString driver,unsigned char *Buf,long addr)
{
        HANDLE hDevice;
        BOOL bResult;
        DWORD bytesread; 
        
        hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
               FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); 
        if(hDevice==INVALID_HANDLE_VALUE)
        { 
               AfxMessageBox("Error!");
               return 0;
        }
        if(addr!=0)
        {
               SetFilePointer(hDevice,512*addr,NULL,NULL);
        }
        
        bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
        if((bResult==FALSE)||(bytesread<512)) 
        { 
               AfxMessageBox("Error!");
               return 0;
        }
        CloseHandle(hDevice);
        return 1;
}


3
、用RC4加密算法对磁盘加密。

/* RC4加密,KEY是密钥,此处Key[]="MobileStorageSecurity",后期可以用户输入的密码作为密钥 */
RC4_KEY rc4_key;
build_rc4_key(Key,strlen((char*)Key),&rc4_key);
rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);


4
U盘插入计算机时的自动感知

LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
        if ( WM_DEVICECHANGE == message && FALSE == bCopy )
        {
               //刷新设备列表
        }
        return CDialog::WindowProc(message, wParam, lParam);
}


后期改进

  1. 这样就必须要求在电脑上有这个程序,所以在后期采用同样的原理,将这个程序放在U盘里,在加密的时候实现对自身的屏蔽,这样大大提高程序的易用性。
  2. 可以让用户输入密码,将密码作为密钥去加密和解密。

  3.这个只是对一个磁盘最初的512字节加密,后期可以通过对扇区的定位和计算,对目录表及数据加密。

不要密码也能进入win2003

1.当Win2003启动到出现登录提示界面时,可以按住键盘上的Ctrl+Shift复合键,将输入法调出来;

2.用鼠标右键单击输入法工具条,从随后出现的快捷菜单中,选择“帮助”菜单项,再从下级菜单中执行“操作指南”命令;

3.在随后出现的“输入法操作指南”界面中,可以执行“打印”命令,这样就能弹出一个标题为“打印主题”的窗口;在这里,我们可以选中其中的“打印选定主题”选项,再用鼠标单击一下“确定”按钮;这样系统又会打开一个打印界面,选中该界面中的“常规”标签,在对应的标签页面中,用鼠标双击“添加打印机”图标;

4.在接着打开的打印机添加向导设置界面中,继续单击“下一步”按钮,在随后出现的画面中,将“网络打印机”选项选中,并继续执行“下一步”命令;

5.将随后界面中的“输入打印机名,或者单击下一步,浏览打印机”选项选中,然后在对应的文本框中输入网络打印机的具体名称,例如“HP”,继续用鼠标单击“下一步”按钮;

6.接着,屏幕上会出现一个“连接到打印机”的提示界面,该界面提示我们系统无法连接到指定打印机,此时我们可以用鼠标单击该提示界面中的“帮助”按钮;

7.在其后出现的Win2003系统窗口中,在执行“Web帮助”命令,并在打开的帮助界面的右边子窗口中,单击其中的一个超级链接,可以任意选择;

8.单击以后,系统就会自动弹出一个标题为“无法连接到服务器”的窗口,将鼠标移动到该窗口的地址栏中,删除掉以前的信息,并直接输入“C:”符号,单击一下回车键;

9.随后浏览界面就自动“变脸”为资源管理器界面了,单击该界面右边的下拉按钮,从下拉列表中单击“控制面板”选项,这样就能将系统的控制面板窗口打开了;

10.找到该窗口的“用户和密码”图标,并用鼠标双击之,在随后的窗口中选中“用户”标签,并在对应的标签页面中,将其中的“Administrator”选项选中,再用鼠标单击一下“设置密码”按钮;

11.在弹出的密码设置框中,重新输入一个容易记忆的密码,最后单击“确定”按钮,就可以使密码生效了。最后使用该密码重新登录试试.

Q:急:我的超级用户密码忘记了,求解决办法

A:启动/关机脚本:_(1)如果故障计算机使用FAT/FAT32文件系统,那可直接使用Win98引导盘引导.如果使用NTFS文件系统,可将故障计算机上的硬盘取下,以从盘模式挂接到其它的Win2000计算机上.下面的操作以后一种情况为准,假设现在故障计算机的system分区(通常是C:)在新的计算机上成为分区E:.

(2)编写一个能恢复管理员密码的批处理文件admin.bat,内容只需要一条"net user"命令即可.如下:

net user administrator 12345678

这儿我们假设当前的管理员是administrator,将它的密码恢复为"12345678".将文件admin.bat保存到"E:\winnt\system32\GroupPolicy\Machine\Scripts\Startup"下,也就是故障计算机原来的"C:\winnt\system32\GroupPolicy\Machine\Scripts\Startup"下.

(3)编写一个启动/关机脚本配置文件scripts.ini,这个文件名是固定的,不能改变.内容如下:

[Startup]
0CmdLine=admin.bat
0Parameters=

将文件scripts.ini保存到"E:\winnt\system32\GroupPolicy\Machine\Scripts"下,也就是故障计算机原来的"C:\winnt\system32\GroupPolicy\Machine\Scripts"下.

(4)将硬盘恢复为主盘,接回原来的计算机,重新启动,等待启动脚本运行.启动脚本运行结束管理员administrator的密码就被恢复为"12345678".

(5)如果要新建一个管理员账号,admin.bat文件的内容可以修改为:

net user admin 12345678 /add
net localgroup administrators admin /add

这样一个名为"admin",密码是"12345678"的管理员账号就建立了.

这个方法不仅可以恢复独立服务器上本地管理员密码,也可以恢复Win2000域中域管理员的密码.

WINDOWS程序,架构

   进行Windows程序设计,实际上是在进行一种对象导向的程序设计(OOP)。这一点在Windows中使用得最多的对象上表现最为明显。这种对象正是Windows之所以命名为「Windows」的原因,它具有人格化的特征,甚至可能会在您的梦中出现,这就是那个叫做「窗口」的东西。


  桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。另一类窗口是对话框,它可以有标题列也可以没有标题列。

  装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。


  作为对象,使用者会在屏幕上看到这些窗口,并通过键盘和鼠标直接与它们进行交互操作。更有趣的是,程序写作者的观点与使用者的观点极其类似。窗口以「消息」的形式接收窗口的输入,窗口也用消息与其它窗口通讯。对讯息的理解将是学习如何写作Windows程序所必须越过的障碍之一。


  这有一个Windows的消息范例:我们知道,大多数的Windows程序都有大小合适的应用程序窗口。也就是说,您能够通过鼠标拖动窗口的边框来改变窗口的大小。通常,程序将通过改变窗口中的内容来响应这种大小的变化。您可能会猜测(并且您也是正确的),是Windows本身而不是应用程序在处理与使用者重新调整窗口大小相关的全部杂乱程序。由于应用程序能改变其显示的样子,所以它也「知道」窗口大小改变了。


  应用程序是如何知道使用者改变了窗口的大小的呢?由于程序写作者习惯了往常的文字模式程序,操作系统没有设置将此类消息通知给使用者的机制。问题的关键在于理解Windows所使用的架构。当使用者改变窗口的大小时,Window给程序发送一个消息指出新窗口的大小。然后程序就可以调整窗口中的内容,以响应大小的变化。

「Windows给程序发送消息。」我们希望读者不要对这句话视而不见。它到底表达了什么意思呢?我们在这里讨论的是程序代码,而不是一个电子邮件系统。操作系统怎么给程序发送消息呢?

  其实,所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。

  无疑,读者对程序呼叫操作系统的做法是很熟悉的。例如,程序在打开磁盘文件时就要使用有关的系统呼叫。读者所不习惯的,可能是操作系统呼叫程序,而这正是Windows对象导向架构的基础。

  程序建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。Windows通过呼叫窗口消息处理程序来给窗口发送消息。窗口消息处理程序根据此消息进行处理,然后将控制传回给Windows。


  更确切地说,窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。例如,所有Windows程序中的所有按钮均依据同一个窗口类别。这个窗口类别与一个处理所有按钮消息的窗口消息处理程序(位于Windows的动态链接库中)联结。

  在对象导向的程序设计中,对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和Windows为每个窗口以及系统中那个窗口类别保存的信息。


    窗口消息处理程序处理给窗口发送消息。这些消息经常是告知窗口,使用者正使用键盘或者鼠标进行输入。这正是按键窗口知道它被「按下」的奥妙所在。在窗口大小改变,或者窗口表面需要重画时,由其它消息通知窗口。

  Windows程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。

  如果您对这段Windows架构过于简略的描述将信将疑,就让我们去看看在实际的程序中,窗口、窗口类别、窗口消息处理程序、消息队列、消息循环和窗口消息是如何相互配合的。这或许会对您有些帮