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

大学生IT创业计划书

   若干年前,我们憧憬IT业,因为IT业神圣的,很多硅谷的故事给我们很多启迪,IT业不仅可以创造无数富豪,而且其中很多都是年轻的学生,那时候IT就是一个神话……
    
    若干年后,我们进入IT业,发现原来IT没有那么神秘。确实IT创造了很多神话,Yahoo!,Microsoft等是早期IT的神话,现在Google来了,中国的Baidu也上市了,造就了很多百万富翁。中国纳斯达克上市公司很多了,最早的是网易、新浪、搜狐,然后是前程无忧、携程网、空中网、TOM、e龙、掌上灵通、金融界、分众传媒、德信无线、中芯国际、亚信科技、九城软件、CDC(china doc com),现在的baidu。中国目前有18个纳市上市公司,明年还有更多。这样看的话现在的IT业前途是很光明,或许IT业在走向成熟。但是成熟的背后寓意着什么,一个不成熟的行业往往能造就很多天才,一旦这个行业走向成熟,那天才不好容易诞生了,想白手起家什么的,也困难。说到这里都没有围绕题目在转,因为我想先把文章的背景说明下,然后再说明下自己一不是研究这个领域的专家,也不是搞互联网的老手,自己只是一个个人站长,或者说还是一名本科大学生,在这里写这篇文章,唯一一点就是自己还算在互联网里学习了几年,有了一点对IT业,互联网行业自己的一点看法,于是就写下来,大家可以看下,不知道有没有可取之处。 大学生创业网


    现在搞真的很难了,如果你是学生的话,我不是在唬你。你以前可能听说一个加拿大的小学生,9岁左右的时候,就靠互联网挣了不少的财富,2000年他还随加拿大总理访华了,这个小孩子能不能成为比尔·盖次第二我们这里不讨论。这么小的孩子可以成为富翁,只有IT才能成就,但是现在在中国,你说可能吗?反正暂时我没有听说过,以前有一个黑龙江漠河的神童,现在也不说了,结果怎么样我也不知道。刚才说到搞IT难是因为现在IT需要的起点高了,我就拿互联网一个方面说明,2000年以前的时候,做1-2张静态网页就可以挣2-3万,会个动态网页那是非常牛的。加拿大的那个小孩子就是靠做网页挣钱的,阿里巴巴的马云最初积累资金我觉得也是做网页挣的,但是现在有了做网页的工具了,不用一行一行写代码了。而且会做网页的中国人太多了,会ASP、PHP、CGI、JPS、ASP.NET的都大有人在,中国现在有个人网站的人都数不胜数。现在做网站门槛很低,但是很少能成功的。门槛低,但是需要的起点高。本身现在大学生自主创业追者众成者寡,大学生创业很不容易。但是事在认为,相对而言,我感觉大学生如果要创业的话,选择IT业的一些东西,起点是高了,对技术要求是很高,但是只要把握好方向后,坚持不懈还是能成功的。新东方的周承刚,很多喜欢新东方的同学都应该知道,他说了一句话我至今难忘,他说为什么俞敏洪成功了,前提是俞敏洪是当时他们班成绩最差的,而现在原来他们班成绩最好的几个都给他打工,因为在这十年中俞敏洪一直在做同一件事情;百度成功了因为李彦宏一直坚持在做同一件事情,ChinaRen创始人陈一舟再次创业创办“空中网”,然后也成功了。成功学的秘诀就是坚持。所以我觉得大学生IT创业,即使丁磊这样的前辈都不赞成大学生创业,我还是觉得很有好处的。 大学生创业网


    先举几个例子,我自己身边的朋友,他们有的现在已经毕业了,有的现在还是学生,但是起步都是从大学开始的,做的事业都是互联网方面。虽然不是非常成功,但是还是值得我们广大大学生IT创业借鉴的。个人网站站长开始建站的时候肯定喜欢在源码下载站上转悠,都知道中国站长站,我的朋友不是该站站长,但是也是源码下载站,一个是源易网的站长(杭商院),一个是下吧的站长,现在网络开始火了,这些代码下载站也火了,流量也不小,网站收入也不少,肯定能养活站长。FlashKu的站长:碧落洞仙和纳米,陕西的两个学生,网站排名不错,收入也可以。还有商务零八的岳贵,西南交大的,据说他发了,挣钱不少,厦门的站长大会他也去了,也算在圈子还是有一点的知名度的。还有华中科大学生创办的5Q地带,很多大学生朋友都知道。还有2000年清华大学的三位博士、三位硕士创办的蔚蓝书店。这些都算是值得我们学习的前辈。大学生IT创业是行得通的,但是还是应该注意下问题,下面我就谈谈个人的看法:

大学生创业网


一、找准目标 大学生创业网


    做IT互联网的,很容易迷失自己,我从余世维老师那里听到这样一个比喻“中国的中关村建设是很失败的,中关村其实就是一个村,因为里面的IT公司小农意识太强了:看到别人卖电脑好,大家都卖电脑;看到别人做通讯设备,大家都做通讯设备”,其实我们这个IT互联网大圈子不也是一个村吗?看到门户网站成功了,无数人都想做门户;看到音乐网站成功了,很多音乐网站就浮现;看到HAO123成功了,无数“HAO123”也跟着上来;现在网络游戏很火,国内制作网络游戏的公司大面积的出现。当然我所说的是一个大环境,不要说个人了,大公司都不好把握方向。对于个人或者大学生团队,应该量力而行,什么能做,什么适合自己去做。若干年前我也失败过,我看到黑龙江几个大学生创办了一个校园电子商务网站,是局域网内的,做盒饭生意,做得有声有色的。我觉得我在技术方面各方面都不会比他们差哪里去的,于是我和同学合作,一起做起了校园电子商务网—巴巴哈,情况怎么样呢?第一年还可以,不过确实很辛苦,因为从进货到整理定单到发货,全部的工作都是自己在做,而且很多交易都是网下进行的,商品的利润也不是很高。到后来问题更严重,时间上已经不允许我再经营,很多外地订单都不能及时送出。最后我总结了下,电子商务特别是B2C电子商务还是前卫的人士玩的东西,在我大学所在地区还没有达到那种程度,一个学校里很少人愿意网上买东西,很少人会利用网络来服务生活的。这是电子商务的困惑,也是互联网的困惑,同时也是中国网民素质、网络教育的困惑。大学生做事情最容易理想化,所以相当然的做事情的也很多,大学生创业失败几率大也是因为这个原因。

手动清除chcp.exe病毒 保护MSN的安全

  随着即时通讯工具的强大,木马病毒也加快了脚本,MSN早就成为了其通向第三方计算机感染跳越的平台。在好友圈中,只要盗取一个MSN好友帐号或感染一台用户计算机,病毒即会伸出罪恶之手,将会在用户MSN聊天时发送病毒信息。

    病毒分析
    该病毒属于MSN蠕虫变种,被感染的计算机会自动向MSN联系人发送诱惑文字消息和带毒压缩包,当对方接收并打开带毒压缩包中的病毒文件时,系统即成为新的受害者,并因此尝试感染另一台计算机。病毒大小为434,176 字节,通过MSN聊天工具进行传播。

    被感染的计算机,病毒首先会在系统目录 %Windows%下生成含带病毒源体的F0538_jpg.zip压缩包,随后病毒自身开始在计算机中的%Windows%目录下创建副本chcp.exe 可执行文件,并在注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]分支下建立"chcp.exe"="%Windows%\chcp.exe"自启动项目,然后病毒开始修改注册分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]下的"SFCDisable"=dword:ffffff9d  和"SFCScan"=dword:00000000值,进行关闭系统文件保护,并且更改  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]分支下的 "WaitToKillServiceTimeout"=的值为"7000",达到更改自动关闭进程等待时间的效果。

    完成上述后,病毒仍没有安静的等待,而是查找被感染的计算机中是否存在FTP目录,如果有则将原正常程序改名为backup.ftp、backup.tftp并复制到%System%\microsoft目录下,随后在系统目录%System%下写入ftp.exe、tftp.exe、dllcache\tftp.exe、dllcache\ftp.exe可执行程序,做完一系列的手脚,病毒开始向MSN联系人发送诱惑型文字消息,并夹带毒包F0538_jpg.zip欺骗用户打开。

   清除方法
    中了此毒的用户也不要紧张,在了解了生存原理后要想清除该病毒也非难事,只要按照以下几个步骤实施即可将病毒清除出界,让系统中的MSN正常运行。

    一、首先要进入注册表分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下,将"chcp.exe"="%Windows%\chcp.exe"自建的随机启动项删除,完成后重启计算机。

    二、进入%Windows%\目录下将病毒源体文件chcp.exe及F0538_jpg.zip压缩包删除。

    三、将目录%System%下的FTP破坏代替程序ftp.exe、tftp.exe、dllcache\tftp.exe、dllcache\ftp.exe删除,并将%System%\microsoft目录下的backup.ftp、backup.tftp改回到目录%System%下。

    四、删除注册表分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]下的"SFCDisable"=dword:00000000键值,恢复系统文件保护。

    五、最后将注册表[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]分支下的"WaitToKillServiceTimeout"=改为"20000" 从而恢复系统自动关闭进程等待时间的默认配置。
           
    笔者按:在MSN病毒中变体有很多种如:MSN机器人、MSN小丑、MSN性感相册等,其原理都是利用MSN作为平台在同聊友沟通的同时发送病毒信息,通过MSN好友关系欺骗用户点击,然后再次传播,从而形成强大的传播途径。为了更好的处理此类病毒,这里建议用户加强计算机的先期保护如:开启杀软定时升库,安装安全类软件,不定期打入系统补丁等,并且多了解每日病毒动态,即时作好防范工作即可,一但用户被感染时应立即作出回应,利用手工删除或下载相应的专杀工具进行清理,以免让更多的用户成为受害者。

用PHP输出静态页面的两种方法

        用PHP输出静态页面的方法,就我所知道的,有2种,一种是利用模板技术,另一种是用ob系列函数。两种方法,看起来都差不多,但是实际上,却是不同的。

第一种:利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。

这里我用smarty做例子,说明如何生成静态页

<?php
require('smarty/Smarty.class.php');
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/index.htm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001.Html", "w");
fwrite($fp, $content);
fclose($fp);
?>
第二种方法:利用ob系列的函数。这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:

<?php
ob_start();
echo "Hello World!";
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>

把o-blog的编码转换为utf8的过程

        前几天我把我使用的o-blog转换为utf8了。现在我整理了一下资料,把转换的过程记录下来,与大家分享一下经验,希望o-blog的新版本中可以出现utf8版本。我现在使用 o-blog 的版本为2.6如果版本不对,请你下载2.6版本.
       在转换之前,我有必要提醒你一下,你必须要把所有的网页和数据库的内容备份一下,万一转换的过程失败,你也可以迅速恢复数据或者可以重新转换。
如果你备份好数据了,那我们开始吧。我转换的思想是:将所有的文本文件的编码改为utf8,再建立新的charset为utf8的数据库。
        首先,要把o-blog使用的所有文本文件的编码改为utf8,这里所说的文本文件包括o-blog所有的php和模板文件中的html、css文件。上网搜索了一下,可以选择的工具有UltraEdit和EditPlus。不过我使用的是EditPlus。将一个打开,再选择另保存为,再覆盖原来的文件就可以了。在此过程,可能有些文件的编码无法保存为utf8,可以先不管。   
      下面开始修改文件。
       打开 admin/class/mysql.php,找到下面的这一行
      mysql_select_db($dbname);
     在其前面加入以下代码:   
      if($this->version() > '4.1') {
   mysql_query("SET NAMES 'utf8'");
          mysql_query("SET CHARACTER_SET_CLIENT=utf8");
          mysql_query("SET CHARACTER_SET_RESULTS=utf8");
  } else        
if($this->version() > '5.0.1') {
      mysql_query("SET sql_mode=''");
}  
        使用EditPlus菜单“查找”下的“在文件中查找”对话框查找charset=gb2312,其中文件夹选择o-blog所在的目录,这样可以省很多的功夫.找到后把charset=gb2312替换为charset=utf-8.      
        其次要修改原来install.php文件
        把 TYPE=MyISAM 替换为 ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci。
        然后在你的空间中运行install.php,进行新的安装,如果你使用的数据库和原来的那个相同,我特别要提醒你,使用的表的前缀必须要和原来的不同,要不然会造成数据库里面原来的数据被覆盖。
       安装结束后你可以打开o-blog来看看页面上是否出现乱码,如果出现了乱码,你得查看你使用php文件和模板文件的编码是否为utf8. 如果显示的文字,还未算转换成功。由于o-blog里面使用的切割字符串函数并不是用来切割utf8字符集,在切割得出的字符串中最后一个汉字的编码很有可能不完全,这样在网页的源代码中看到的所有中文是乱码。下面要打开admin/functions.php查找 “cn_substr”函数,大概在272行,在其前面加入以下函数:
// 用来避免 utf8 乱码
function utf8_trim($str) {
    $len = strlen($str);
    for($i=strlen($str)-1;$i>=0;$i-=1){
        $hex .= ' '.ord($str[$i]);
        $ch   = ord($str[$i]);
        if(($ch & 128)==0)    return substr($str,0,$i);
        if(($ch & 192)==192)return substr($str,0,$i);
    }
    return($str.$hex);
}
前往 291 行,就会看到 return $s."...";
在前面一行加入调用utf8_trim的以下代码
$s = utf8_trim($s);
这样的做法存在冗余的代码,不过这样做是最为简单的,希望风色可以进行改进。
      按照网上的说法,还要修改函数htmlspecialchars,把原来的用法
      $s=htmlspecialchars($s);
      改为 $s = htmlspecialchars($s,ENT_QUOTES,"UTF-8");
      我修改了一部分就没有修改了,因为我发现blog已经没有乱码问题了,查看数据库里面的内容,挺很正常。所以我也不知道那个修改有没有用了,有兴趣的网友可以试试看。
不知道你们转换怎么样了呢?我的可以正常运行了。
       下面还有一个问题,怎么样把原来的数据导入到里面去。我想到了两个解决的方向。
第一、后台里面的数据的导入导出。导入的数据会转换为gb2312,这是与现在使用utf8冲突的,这就需要修改现在代码,把原来备份的数据导进去。我没有深入了解那部分的代码,所以我不知道怎么修改,解决了导入,还要解决导出的问题。
第二、在另外一个博客程序cblog中,有把o-blog转换为cblog的程序,可以把gb2312编码的数据转换为utf8并插入到现在使用的数据库里面去。可能修改一下代码就可以拿来用了。可是这部分我也没有研究,我的日志比较少,基本上已经手动输入到现在使用的博客里面去了。
        希望风色或者longbill研究一下,怎么处理好数据的导入导出这部分,更加希望拥有新版本的o-blog。
        如果文章中还有遗漏的地方,请提出来,我边修改边测试的,当时没有作记录,现在也是考记忆来写这篇文章了。
        我在写这篇文章的时候,longbill也处理好转换为utf8的问题了,呵呵,恭喜!

编写autorun病毒免疫工具

autorun病毒的危害相信中过招的人都有体会。其最大的特点就在于很难清除干净,现在可以提前对系统分区做一次免疫工作,而那些已经中了autorun病毒的用户也能顺便将病毒清除。  
    
有人曾经使用系统组策略的方法,不过对于初学者来说有点复杂。现在复制以下代码到文本文件中,保存为bat文件即可。
    @echo off
cls
echo          按 S 键删除Autorun.inf并进行免疫
echo.
echo          按 D 键删除免疫程序
echo.
echo          按其他任意键退出
echo.
echo.
SET Choice=
SET /P Choice=        请选择要进行的操作:  
IF /I ’%Choice:~0,1%’==’s’ GOTO setup
IF /I ’%Choice:~0,1%’==’d’ GOTO Delset
IF /I ’%Choice:~0,1%’==’q’ GOTO Exit
exit
:Setup
taskkill /im explorer.exe /f
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do @(
    if exist %%a: (
        rd %%a:\autorun.inf /s /q
        del %%a:\autorun.inf /f /q
        mkdir %%a:\autorun.inf
        mkdir %%a:\autorun.inf\"病毒免疫勿删除../" 
        attrib +h +r +s %%a:\autorun.inf
        
    ) 
)
start explorer.exe
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  if exist %%a:\nul (
    >1.vbs echo msgbox^ "%%a:免疫成功",64,"提示:"
    1.vbs
  )
)
del 1.vbs
echo.
echo.
echo                        按任意键退出...
pause>nul
exit
:delset
For %%a In (C D E F G H I J K L M N O P Q R S T U V W X Y Z) Do @(
    If Exist %%a: (      
        rd %%a:\autorun.inf /s /q
                
    ) 
)
echo.
echo.
echo                        操作完毕,按任意键退出...
pause>nul
exit

    具体原理为通过检测autorun.inf和删除相应文件达到直接消灭病毒的目的。操作比较简单,只要按两个键就可以了。