<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lzp729@Blog</title>
	<atom:link href="http://blog.lzp729.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.lzp729.com</link>
	<description>道法自然</description>
	<lastBuildDate>Sun, 15 Apr 2012 17:22:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>研究笑话 &#8220;老板，今天我想请一天假&#8221;</title>
		<link>http://blog.lzp729.com/weblog/%e7%a0%94%e7%a9%b6%e7%ac%91%e8%af%9d-%e8%80%81%e6%9d%bf%ef%bc%8c%e4%bb%8a%e5%a4%a9%e6%88%91%e6%83%b3%e8%af%b7%e4%b8%80%e5%a4%a9%e5%81%87.html</link>
		<comments>http://blog.lzp729.com/weblog/%e7%a0%94%e7%a9%b6%e7%ac%91%e8%af%9d-%e8%80%81%e6%9d%bf%ef%bc%8c%e4%bb%8a%e5%a4%a9%e6%88%91%e6%83%b3%e8%af%b7%e4%b8%80%e5%a4%a9%e5%81%87.html#comments</comments>
		<pubDate>Sun, 15 Apr 2012 17:21:55 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[Weblog]]></category>
		<category><![CDATA[提高]]></category>
		<category><![CDATA[收入]]></category>
		<category><![CDATA[笑话]]></category>
		<category><![CDATA[请假]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=161</guid>
		<description><![CDATA[网上早年就在流传一个颇有意思的笑话 &#8212;&#8212;
向老板请一天假,老板推心置腹地对我说：&#8221;你想请一天假？看看你在为公司做了什么   一年里有365天， 一年52个星期，你已经每星期休息2天，共104天，剩下261天工作。    你每天工作8小时，有16小时不在工作，去掉174天，剩下87天。 每天你至少花30分钟时间上网，加起来每年23天，还剩下64天。   每天午饭时间你花掉1小时，又用掉46天，还有18天。 通常你每年请2天病假，这样你的工作时间只有16天。   每年有5个节假日公司休息不上班，你只干11天。 每年公司还慷慨地给你10天假期，算下来你一年就工作1天，而你TMD还要请这一天假.
今天无意中又一次看到这个笑话, 本着死理性派精神, 我要算算到底是哪里有谬误, 以及一年我到底干了几天&#8230;.
1. 一年里有365天， 一年52个星期，你已经每星期休息2天，共104天，剩下261天工作。
这个没错, 的确是这样
2. 你每天工作8小时，有16小时不在工作，去掉174天，剩下87天。
这里开始出现问题了, 实际上实在偷换概念, 174是通过16 x 261 / 24 算出来的, 可以发现, 这里将广义上的一天的概念偷换成了24小时, 1天确实有24个小时, 但是24个小时确不一定是1天. 如若姑且按照这样的方式计算, 那么后文应该也应该采取小时计算才可取
3. 每天你至少花30分钟时间上网，加起来每年23天，还剩下64天。

这里的23的错误就更甚了, 猜了好几遍, 终于发现23居然是365 x 0.5 / 8 算出来的四舍五入&#8230; 首先前面已经剔除了肯定没有工作的104天, 然后按照小时计剔除了8小时工作制以外的时间, 而这里再一次以365做分数参数计算, 是明显错误的, 而是应该用87 x 0.5 / 8 = 6天才计入总量才对, 其次在第2条中已经明确了将小时转换成天数计算的方式, 那么这里分母就不应该以一天工作8小时计算, 而是应该以一天24小时计算, 所以正确的应该是87 x 0.5 [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/weblog/%e7%a0%94%e7%a9%b6%e7%ac%91%e8%af%9d-%e8%80%81%e6%9d%bf%ef%bc%8c%e4%bb%8a%e5%a4%a9%e6%88%91%e6%83%b3%e8%af%b7%e4%b8%80%e5%a4%a9%e5%81%87.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>家庭网络从设计到配置（有线无线大桥接，DD-WRT中继桥，局域网工作组计算机名字解析） &#8212; 完美神作！</title>
		<link>http://blog.lzp729.com/writings/home-network.html</link>
		<comments>http://blog.lzp729.com/writings/home-network.html#comments</comments>
		<pubDate>Sun, 26 Feb 2012 15:20:38 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[文章发表]]></category>
		<category><![CDATA[DHCP]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DNSMasq]]></category>
		<category><![CDATA[repeater bridge]]></category>
		<category><![CDATA[中继桥]]></category>
		<category><![CDATA[局域网]]></category>
		<category><![CDATA[弱电设计]]></category>
		<category><![CDATA[无线路由]]></category>
		<category><![CDATA[有线路由]]></category>
		<category><![CDATA[桥接]]></category>
		<category><![CDATA[解析]]></category>
		<category><![CDATA[计算机名]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=159</guid>
		<description><![CDATA[本文针对对家庭网络的功能有一定要求，对网络基础知识有一定了解的人。。。 比如我自己。。。如果正在看博的你也是这样，就请你耐心看完，相信你会有所收获。
对于家用的局域网络，或许跟商用网络比起来是个十分简单的东西，但是现在一个家庭里电脑越来越多，无线设备越来越多，很多人开始玩NAS，玩路由下载，玩网络播放器，玩高清&#8230;&#8230; 这一切都对我们自己家里的网络提出了很高很高的要求，加上现在带宽越来越大，不要以为几年前那种一个有线路由插几根网线就能打开草榴社区的快感会延续到现在。。。举两个例子：

有个同事，跟我闲聊时，表示近日来很烦躁，电信ADSL给升到10M了，可是老是断线，本想着晚上睡前迅雷挂点啥，早上就能得点啥的，结果发现才下了1分钟，网络就断了，狂吐槽电信网络差，更有换联通FTTB的冲动。哥们我也算热心，把我自用的有线路由借他一试，乖乖，问题就这么解决了。其实原因很简单，10M带宽下迅雷高资源数的东西，连接数必需很高，上5000的连接数不是几年前老旧的16M甚至8M内存+100M不到的CPU的有线路由抗得住的，硬件资源不足，必然造成路由器罢工咯。
还有个同事，想玩高清，购入大容量移动硬盘和网络下载器各一枚，挂了好多片，想在客厅的大电视上看，播放硬件也不错，可不管怎么调解码器就是卡顿，偏偏又找不到好的解决方法。他将此事说于我，我问起来龙去脉，原来那哥们自恃802.11n的无线网络，想通过无线网络传送高码率的片子到播放器，可他所用的是2.4G网络，最大才150M带宽，而且受制于频段内其他无线设备噪音的影响。。。 别以为100M多的带宽很牛掰的样子，各种开销去除之后，就这样的带宽还想无线传高清。。。回来建议他回家牵一根千兆网线，卡顿现象迎刃而解。

好吧，这种例子多的很，都是因为家庭网络不够好造成的。

至于我自己，我有电信FTTH 20M带宽，我家里有3台常开机的电脑，有4到5台保持无线连接的各种爱疯和安卓，我老妈开电视就是看迅雷高清连续剧，标清的都不看。。。 我要泡CHD玩PT，还要RDP和SSH我的各种服务器，还用插件每分钟刷新浏览器杀CnBeta和韩寒，我还经常坐在沙发上想用手机VNC我的电脑看看我指定的工作做的如何，我老婆要求貌似低一些，只会在iPad上打开taobao的速度超过5秒的情况下才会大喊大叫~~~ （老婆，我又把你卖了，罪过罪过orz~~ ）
总之各种高帅富搓短穷和不分男女的吊丝应用都要依托家里的网络。肿么办？ X教育要从娃娃抓起，家庭网络要从装修开始。

我在装修之前考虑了几个设计的关键点，大概说一下：


现代普通家庭利用到两类有线网络应用，一种当然是普通的上网，另一种就是通过网线传输的IPTV，所以理论上，为了隔绝信号干扰，应该有两路物理上分离的有线网络，一路走网络，一路走IPTV。
无线网络不能完全取代有线网络，并且对于我这种对NAS玩高清有诉求的人，千兆网络是最基本的需求，为了实现千兆网络，就需要千兆的网线，至少5类线吧，最好是超5类线或以上，我最后用的超5类，还有就是如果布线很多的话还需要千兆交换机。
为了简洁美观，我希望能够把那些基础网络硬件，比如电信的光猫，有线网关路由，各种交换机，电话HUB，有线HUB统统放到墙里的弱电箱去，所以我需要一支大大的弱电箱，并且弱电箱里要有电源。
至于无线方面，那是后话，下面会仔细说无线的那点事。

直接上张设计图，只求满足我的要求，至于满不满足你，反正满足我的了。要说明的是红框框内是弱电箱内的部分。


关于这个设计，现在回头来看依然觉得是那么的美丽，哈哈哈！

布线的事情交给电工了，但是弱电箱里各种设备和连线还是靠自己，遗憾是当时买弱电箱的时候买小了，所以空间十分拥挤，造成电源和各种设备对尺寸都十分敏感，当然仔细找加上自己DIY，事情还是能解决。
上几张图展示一下当时的惨烈局面。





看到我的DIY插座了吧，哈哈，苦于买不到足够小的插座就只有用小模块DIY了，这还真是我的得意之作哦~~~
你能想象这个小箱子里放下了5个插座及电源+1个猫+1个有线路由+3个8口交换机+1个8路有线信号放大器+1个8路电话线hub+各种粗细的线缆吗？哈哈哈， Everything Is Possible！
关于硬件这一块就说到这里，不在赘述了。

硬件到位简单，强大的软件配置才能真正让家庭网络真正强大起来，其实就是指的路由配置了。

我相信现在普通家庭的网络主要有两种模式


买一个无线路由器，应该是DLink， TPLink之类的品牌，价格在300以内。用这个无线路由器拨号连接ADSL（PPPOE服务），还要为连接到这台无线路由的所有有线或无线的电脑提供IP地址（DHCP服务），并且使得所有连接到这台无线路由的客户端都能上网（Gateway服务），另外还会隐式提供DNS服务用来加速域名解析。
这种模式很简单，因为只涉及到1个路由器，规避了很多繁杂的问题，配置简单，基本上就是买个无线路由回来登陆填上ADSL的用户密码就完事，这种比较适合初级用户。限制在于必需将猫和这个无线路由有线连接起来，并且这个无线路由必需要有足够强大的硬件配置来带动整个网络需求。关键是与我的初期设计不相符，我不可能把一个无线路由器放到沙发背后墙里的弱电箱里，而且也找不到那么多网口的家用无线路由（我布线安装了16个网口）。。。
第二种方式就是一个有线路由加上一个无线路由的方式。在这种方式下，一般是由有线路由来做ADSL拨号，并且将内网ip配置成192.168.1.1，并提供192.168.1.x段的DHCP服务，再把无线路由的WAN口通过网线连接到有线路由的LAN口，设置无线路由的WAN方式为自动获取IP，并且将该无线路由的LAN口设置成192.168.2.1，并提供192.168.2.x的DHCP服务和DNS服务，如此一来，连接到该无线路由的所有有线和无线客户端都会获得192.168.2.x的ip，而连接到有线路由的客户端会获得192.168.1.x的ip，这样所有连接到网络的设备就都能上网，唯一的区别是连接到无线路由的设备是先把所有网络请求发送到192.168.2.1（也就是无线路由），再由无线路由转发到有线路由192.168.1.1, 以此来上网，实际上就是在家庭网络内部多做了一个Gateway。
这种方式在本来就存在有线网络，然后再加装无线网络的家庭网络中比较常见。但同时，我认为这样是最不好的网络模式，主要体现在

整个家庭网络上的客户端被人为划分到两个网段，不利于互访。
由于连接到无线路由的客户端的所有网络请求都被NAT了，所以会造成作为主出口的有线路由无法有效的进行QoS管理。


实际上，长久以来我也一直在承受第2种方式带来的种种弊端，只是过去一直依赖有线网络，无线网络用的较少，现在i系和a系的设备多了之后，各种矛盾也越来越激化了。痛定思痛，决定基于第2种模式，来一次家庭网络的软改造。

先谈设备。

有线路由，我的要求是足够小（要放进弱电箱），散热好（至少不能因为温度太高而宕机），配置高（要至少能带的动1w的连接数），功能强（一定要有QoS，否则迅雷一开，别的设备别想上网了）。最终选定的是NetCore 285p，呵呵，不是你在官网看到的那个285p，而是别人DIY之后重新封装的版本，在原有的基础上减小了体积，增加了内置热敏风扇，并且保持官方的配置（400M的CPU+64M内存），相关应用比较齐全（主要是针对客户端的上传下载带宽及连接数控制和针对网络应用的优先级控制），淘宝链接就不po出来了，一搜便知，价格是180左右。我小研究了一下这个285p的升级rom，感觉也是基于linux内核的变种，相信如果厂商持续开发的话，为了会有更多的功能加入。


无线路由，第一个购入的无线路由是Netgear的WNR3500L，08年美国购入价格是900多点，买这个主要考虑的是硬件够强（Broadcom4718A+64M内存+8MFlash），关键是得到DD-WRT的mainstream支持，另一个考虑因素是因为无线路由要放到外面，考虑到美观因素了。。。 如果不考虑这一点的话，我肯定就去恩山无线买改版的Cisco了，其实就是洋垃圾，运进国内修好了再多加点内存刷上DD再卖，关键是价格啊，大几千块的顶级Cisco，洋垃圾进来，恩山改造完成出库连1000块都不要，实在是物有所值的。但是单看硬件的话，我当年买的3500L也不输给Cisco。

补充下，DD-WRT是一套针对无线路由器的开源系统，就跟android可以刷机一样，无线路由也能刷，DD的功能强大，稳定，花超过500买无线路由的基本上都是奔着DD去的，当然类似的系统还有TOMATO和OpenWRT。官网上有支持的无线路由列表可以去查查看你的路由被支持不。。。 下面所有的无线配置也都是基于DD-WRT来实施的。

言归正传。

第一阶段，我希望设置无线路由器使得连接到无线路由的所有客户端都能够得到192.168.1.x的ip，也就是和有线路由的ip在同一段上，这样就需要无线路由能够转发DHCP的request和response，但如果仅仅只是DHCP的中继是远远不够的，因为实际上所有的请求网络连接还是通过了NAT转换，当然还可以把无线路由设置成router模式来做两个网段间的路由，但是有线路由并一定会为192.168.2.x的ip服务，因为可能会把发送192.168.2.x的数据包丢到WAN口去，当然可以用16位大子网的方式更新路由表，把2.x的ip的数据包丢到LAN口，但是这样不是太复杂么。。。 何况在我们拥有DD-WRT的情况下还依赖最最原始网络功能就太不象专业玩家的做法了~~~ 好吧，我很大胆的把自己说成专业玩家。。。
这里我最终采用了vlan划分的方式，将3500L上所有的无线，WAN，LAN全部捆绑到同一个VLAN，并且完全禁用掉3500L的WAN功能，都好像3500L消失了一样，这样就相当于有线路由被延伸到了墙外，并且还拥有了无线的能力，也就是说不论是通过有线还是无线连接到3500L的客户端都和连接到3500L WAN口的有线路由处于同一个子网，而所有这些背后的转换工作全部都交给了3500L上的DD系统帮我们完成，我们要做的只是把所有3500L的网络接口绑定到一个vlan里去，而已。。。 这样一来，所有的DHCP，DNS和路由请求都被广播到了192.168.1.x网络上，并且有线路由能够监听到，并且有线路由无需做任何配置上的改动哦~~
具体的详细配置，请去这里，这里我只po几张DD配置的关键截图，照着图试一下也能成功。


这里其实可以看到我将无线路由的WAN直接禁用，然后将ip设成192.168.1.2，并且网关，DNS之类的全部设到有线路由，实际上在这一阶段中是没有不要的，只要设置个ip就可以。注意那个将WAN口指定为交换口的选项，就是说通过这个选项已经将WAN口和LAN直接桥接到一起了，DD会自动帮我们把WAN和LAN绑定到同一个vlan下，我们实际上只需要把无线也绑定到vlan就可以了。

注意这点，默认的操作模式是Gateway，我改成了Router，原因比较晦涩，因为在Gateway模式下，实际上连接到3500L的所有客户的所有请求会被3500L做NAT之后转发到192.168.1.1，但是由于我们已经将所有接口都绑定到同一vlan，所以192.168.1.1会直接监听到3500L上的客户端请求，并不需要3500L的NAT，所以有可能某一客户的一个请求，会造成192.168.1.1接受到两次，1次来自客户端自己，1次来自3500L的NAT之后的请求。而设置成Router模式的话，3500L会发现连接到自己的拥有192.168.1.x的ip的客户端所请求的192.168.1.1的连接与自己的LAN口处于同一网段，所以并不会转发这条连接的请求，从而192.168.1.1只会收到真正来自客户端的请求。其实我对自己的这个解释也没有满分的把握，还有待验证。反正Gateway和Router都能正常工作，但是设置成Router模式是我推荐的做法。


在这个设置页面里，有了一个叫做br0的桥，可以看到我把所有的interface都绑到了这个桥。

至此，不论是通过墙上的有线网口还是通过3500L上的有线网口还是通过3500L上的无线连接到网络的客户端，都会得到来自有线路由分配的192.168.1.x的ip，而且任意客户端之间全部可以ping通。至此可以说任脉已经打通了。

有任脉，那必然还有督脉咯~~~

如今的网络谁还会去用ip访问局域网内的网络设备啊。。。 别说你还想坚持这么干，你的脑容量真是闲的慌，能够记住DHCP分配的ip，好吧，我承认你可以在有线路由的DHCP功能里做MAC与IP的绑定保留，而且我过去也一直是这么做的，可是，可是，可是。。。 家里现在网络设备真的太多了，电脑动不动又有线又有无线的，我实在hold不住这么大的工作量啊，我想要的是只要连接到网络的设备都能够直接通过名字访问到，去他娘的DHCP保留IP，我已经感受到了最近这台i系设备带来的不可承受之轻，我要用更加智能的方式完成这些本来自动完成的事情。

我估计第一个跳入你脑子的就是DNS。DNS的作用就是把名字转换成ip，没错，但是你忽略了那个字母D，就是说DNS是把域名转换成IP的，可要在家里跑一个可用的DNS起来谈何容易，那需要太多的勇气~~~要在家庭网络内建个域。。。 一台独立windows server， 要配域控，要配DNS，要配DHCP，还要每个设备都进域，买糕的，这可不是Everything Is Possible, 这是Mission Impossible！我玩网络，拒绝网络玩我~~~

然后你会想到WINS服务，是的，WINS服务就是用来针对DNS在工作组状态下的局域网里能力的不足的，但是天哪，WINS甚至是windowns 2000网络方案里建议剔除的东西，我现在却要搞这个老旧的东西。。。 虽然3500L上可以搭建一个samba服务起来跑WINS服务，但是同学们，我的有线路由不给力，DHCP选项里不能指定WINS服务器，也就是说192.168.1.1分配ip的详细配置中不能设置WINS选项，更不能把WINS指定到3500L上去。。。更何况M$早就把NetBios协议从默认系统安装中删除了，而NetBios协议就是WINS服务和星际局域网对战的基础协议，我不再玩星际了，也不想给每个设备装NetBios协议，我也不知道能不能给i系和a系装NetBios，总之WINS is not an option。

苦恼~~~ 呵呵

其实还有个东西可以用，说出来你都不信，就是DNS消息队列服务，linux上的名字叫做DNSMasq，而DD系统默认就带有这个服务，而且可以很方便的配置，甚至都不需要telnet或ssh，更不需要OPT环境，一切都是那么的河蟹。。。 关键是用到了DNSMasq服务中有两项重要的但不常用的功能，那就是可以取代DHCP服务来分配IP，和可以取代DNS完成简单的域名解析。又说到了DNS，这里的DNS就不一样了，因为可配置DNSMasq可以完全替代DHCP，所以我可以在DNSMasq的DHCP配置中加入DNS后缀，从而使得每一台连入网络的客户端都自动拥有了一个计算机名.后缀的域名，另外DNSMasq可以自动expand计算机名到计算机名.后缀，这样我只指定计算机名访问，也能被DNSMasq当成域名来解析。。。 所有的这些功能都包含在DNSMasq服务中，于是我这个懒人有福了，不用配太多东西就能达到要求。另外DNSMasq还有个好处，就是节省内存，基本上可以节省500K左右，对于这种SoC的系统来说，不少了，可以多跑个服务了都~~~

第二阶段开始，大体过程是这样，禁用掉有线路由的DHCP功能，而启用无线路由3500L上的DNSMasq功能来分配IP，因为现在任脉已打通，所以只要连接到网络的设备都能够得到3500L分配的IP，这一点没问题，然后我需要配置DNSMasq的DHCP详细，使得每一个客户端得到一个192.168.1.x的ip，并且DNS为3500L的192.168.1.2，并且网关是有线路由的192.168.1.1。另外除了要局域网互访之外，当然还要上网啦！所以需要指定3500L的默认上级DNS到192.168.1.1，也就是在第一阶段中第一张配置图中有配置DNS的原因，所以有线路由的DHCP功能必需要关，DNS功能必需要开。其实关掉DNS也可以，DHCP上直接把DNS配置成google的8888和8844就可以了。。。不过这样没有本地缓存的DNS会造成上网明显变慢，而且会禁用掉我在下面还要增加的本地局域网的自动翻墙特性~~~



第一阶段里面是犹抱琵琶，第二阶段里这个页面的配置终于三点全露了~~~ 可以看到我启用了DHCP功能，但是勾选Use DNSMasq for DHCP之后，那么DHCP服务实际上是关闭了，而DNSMasq服务会读取这里的DHCP的配置来提供IP，我配置中，DHCP配置里的DNS就是3500L自己，这样所有客户的域名查询都会向这台3500L查询，我指定了WINS服务器，请你不要设这一点，这是我做实验时候的残留配置，应该果断删除的，图都截了，人懒，肿么办。。。

关键的设置来了， 注意DHCP Server段的Lan Domain十分重要，这里就指定了客户端的DNS后缀哦~~~ 而在下面的详细配置中， local选项的值也要与这里对应，几个常用设置和注释我都写上了，有需要的自己改，或者看这里

最后展示下电脑上得到的ip配置，对了，DNSMasq目前还不支持IPv6，我表示这对家庭网络来说无影响~~~



该到此结束了~~~才怪。。。

我恨我花了900多大洋从西洋请回来的3500L被某人小DLink的配置给秒了。。。 又因为3500L放在1楼客厅，所以2楼的信号特别不好，尤其是2楼的卫生间里，上网看个新闻简直要净身烧香拜佛才行，所以果断请回一尊大佛~~~ 希望能够镇住我家2楼的阴暗死角。。。 好吧，主要原因是被DLink秒了不爽。。。 连5G都不支持。。。 300M连接都没有。。。 CPU 500M都不到。。。 [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/writings/home-network.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>文本输出</title>
		<link>http://blog.lzp729.com/code-life/%e6%96%87%e6%9c%ac%e8%be%93%e5%87%ba.html</link>
		<comments>http://blog.lzp729.com/code-life/%e6%96%87%e6%9c%ac%e8%be%93%e5%87%ba.html#comments</comments>
		<pubDate>Sat, 11 Feb 2012 12:27:30 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Windows开发]]></category>
		<category><![CDATA[代码人生]]></category>
		<category><![CDATA[TextOut]]></category>
		<category><![CDATA[文本输出]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=157</guid>
		<description><![CDATA[在以下任何事件发生时，向窗口过程都会受到一条WM_PAINT消息

用户移动一个窗口，导致原来被遮盖的部分窗口暴露出来
用户调整窗口的大小(当窗口类型的设定为CS_HREDRAW和CS_VREDRAW时)
程序调用ScollWindow或ScollDC函数滚动客户区时
程序调用InvalidateRect或InvalidateRgn函数显式生成WM_PAINT消息

当客户区的一部分被临时覆盖时，Windows会试图保存被覆盖的这部分，以便将来恢复时使用，但并不是每次都会成功，在以下情况下有时会发送一条WM_PAINT消息

Windows关闭一个覆盖了部分窗口的对话框或消息框
下拉菜单被拉下然后收回
显示提示消息

少数情况下，Windows总是保存并恢复被覆盖区域，而不再发送WM_PAINT消息

鼠标指针在客户区内移动
在客户区内拖动图标

需要重新绘制的部分被称为“无效区域”或“更新区域”。Windows内部为每一个窗口都保存了一个“绘制信息结构”。这个结构保存着一个可以覆盖该无效区域的最小矩形的坐标和一个其他的信息。如果在窗口过程处理一条等候处理的WM_PAINT消息之前，客户区中的另一部分也失效了，那么Windows将计算出一个覆盖这两个失效部分的新的无效区域和无效矩形，并更新绘制信息结构中的数据。Windows不会在消息队列中放置多条WM_PAINT消息。

InvalidateRect函数强制使客户区中的一个矩形失效，可以通过GetUpdateRect函数获取这些坐标，在BeginPaint函数调用后，整个客户区会变成有效的，也可以用ValidateRect函数使一个区域有效，如果ValidateRect函数的调用使得整个客户区变得有效，那么消息队列中的WM_PAINT消息会被删除。
设备环境DC实际上是GDI内部维护的一个数据结构，对于视频显示，设备环境通常与屏幕上的一个特定的窗口相关联。程序必须在同一条消息中获取并释放DC，并且不能在两条消息中间传递DC，唯一的例外是通过CreateDC创建出来的。


获取DC的方法1


在处理WM_PAINT消息时。窗口过程首先调用BeginPaint函数。这个函数通常会擦除无效区域的背景，并填充PAINTSTRUCT结构的各字段。函数的返回值就是DC。
对于PAINTSTRUCT,程序只能使用前三个字段hdc、fErase和rcPaint，其他的供Windows内部使用。大多数情况下，fErase被设置为false，意味着Windows在BeginPaint函数中已经擦除了无效区域的背景（如果想在窗口过程中自定义背景擦除方式，必需自己处理WM_ERASEBKGND消息）。Windows使用在窗口类型中定义的hbrBackground字段指定的画刷在擦除背景。
如果通过InvalidateRect函数来使矩形失效时，InvalidateRect函数的最后一个参数将指定背景是否擦除，如果设置为false，Windows将不擦除背景，同时在调用BeginPaint时，PAINTSTRUCT结构中的fErase被设置为true。
InvalidateRect中的fErase可理解为是否需要擦除背景，true时Windows会擦除。PAINTSTRUCT中的fErase可理解为通知用户背景是否需要擦除，如果是true，那么用户可以判断这个字段来手工擦除。则，在InvalidateRect中设置为true，即指定需要擦除，那么BeginPaint函数就会擦除，而通知用户会被设置为false，因为已经由Windows擦除了，所以不需要用户再次擦除。
PAINTSTRUCT结构的rcPaint字段是一个RECT，保存了无效矩形的坐标。

InvalidateRect(hwnd,NULL,TRUE);这个调用会使整个客户区无效，并使其后调用的BeginPaint擦除原有的背景。在使用从BeginPaint返回的DC时，Windows无论如何也不会在rcPaint定义的矩形之外绘制。


获取DC的方法2


通过GetDC和ReleaseDC来获取的DC与BeginPaint获取的DC值不同。从GetDC返回的设备环境句柄中的裁剪区域是整个客户区，与无效矩形没有任何关系，GetDC也不会将无效区域有效化，必需由用户调用ValidateRect(hwnd,NULL);来使得整个客户区都有效。
而通过GetWindowDC获取的则是整个窗口区域，包括了标题栏，相应的程序必需要处理WM_NCPAINT（非客户区绘制消息）消息。
对于TextOut(hdc, x, y, psText, iLength)

设备环境DC中的属性决定了文本显示的属性，包括颜色，字体，背景色等。文本的背景色与客户区的背景色不同，文本的背景色是指文本框的背景色。
x,y文本框左上角是相对于客户区左上角的坐标。默认的映射模式是MM_TEXT，即逻辑单位都是像素。
psText是字符串指针，iLength是字符串长度，TextOut不认为字符串以0结尾，如果psText是UNICODE，那么iLength是字符串字节数的一半。
TextOut使用的系统字体，在Windows启动后就不会改变，系统字体要求能够在显示器上起码显示25行80列字符。

GetSystemMetrics函数用来获取用户界面的尺寸，GetTextMetrics从dc中获取字体信息TEXTMETRIC。

除了上图中的重要的TEXTMETRIC字段外，还有
tmExtenalLeading，表示字体设计者建议的两行文字之间的空间大小，一般是0像素。
tmAveCharWidth，表示小写字符的加权平均宽度。一般大写字符的平均宽度是tmAveCharWidth的1.5倍。
tmMaxCharWidth，表示字体中最宽的字符的宽度。
消息处理函数更新为

int cxChar, cxCaps, cyChar;
char szBuffer&#91;50&#93;;
case WM_CREATE:
          hdc = GetDC &#40;hwnd&#41; ;
&#160;
          GetTextMetrics &#40;hdc, &#38;amp;tm&#41; ;
          cxChar = tm.tmAveCharWidth ;
      [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/code-life/%e6%96%87%e6%9c%ac%e8%be%93%e5%87%ba.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>本地加密代理通道及相关应用Reloaded</title>
		<link>http://blog.lzp729.com/general-technic/%e6%9c%ac%e5%9c%b0%e5%8a%a0%e5%af%86%e4%bb%a3%e7%90%86%e9%80%9a%e9%81%93%e5%8f%8a%e7%9b%b8%e5%85%b3%e5%ba%94%e7%94%a8reloaded.html</link>
		<comments>http://blog.lzp729.com/general-technic/%e6%9c%ac%e5%9c%b0%e5%8a%a0%e5%af%86%e4%bb%a3%e7%90%86%e9%80%9a%e9%81%93%e5%8f%8a%e7%9b%b8%e5%85%b3%e5%ba%94%e7%94%a8reloaded.html#comments</comments>
		<pubDate>Mon, 19 Sep 2011 17:57:15 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[General technic]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[代理]]></category>
		<category><![CDATA[服务]]></category>
		<category><![CDATA[翻墙]]></category>
		<category><![CDATA[进程监视]]></category>
		<category><![CDATA[进程重启]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=155</guid>
		<description><![CDATA[最近镇里的局域网访问google的所有服务速度暴慢, 有木有啊!!!
连基本的google搜索都在坑爹啊!!!
至于你们能不能忍, 至少哥不能忍了啊!!! hold不住了哇!!!
开始发飙了啊, 继上次发飙的利用SSH建立windows本地加密代理服务, 现在感觉还是不够方便,不太实用, 有些猥琐, 比较复杂, 所以这次发飙就主要为改善用户体验, 虽然即时可能用户只有偶一个淫&#8230;
主要的问题列一下:

会被杀毒软件判断为病毒
SSH帐号是共享的, 每次改密码都得给好多朋友更新, 太麻烦
iphone之类的设备没法用
创建本地代理服务太复杂, 一定时间后断线了不能自动重连

大概就这些了, 相对root cause和fix也列一下.

会被杀毒软件判断为病毒
root cause &#8211; 是原来创建的本地SSH代理的程序是用多个exe(putty.exe, plink.exe和batch脚本)一起打包, 自动解包运行来启动的, 这种behave会被杀毒软件标记为间谍软件的行为.
fix &#8211; 现在我直接把相关程序的source拿来改掉, customized成为直接连接我的服务器的客户端, 并内置了帐号密码, 这样就不存在解包和自动运行的behave了, 而且内置帐号之后也稍微安全一点, 只是一点点, 因为只有静态de一下就可以看到用户名和密码了, 所以在服务端也有相关的权限设置配合.
SSH帐号是共享的
root cause &#8211; NA
fix &#8211; 这次直接给每个人提供一个单独的帐号了, 所以再有泄露的话也方便K人, 而不用改密码了
iphone之类的设备没法用
root cause &#8211; 因为ios在没有jail break的情况下只有通过VPN翻墙, 而SSH代理和VPN是两码事
fix &#8211; 这次提供了PPTP和L2TP两种模式的VPN给大家免费使用, 速度绝壁不坑爹滴. 当然这个VPN也可以在电脑上使用. 后面会谈谈VPN和SSH代理的异同
创建本地代理服务太复杂,一定时间后断线了不能自动重连
root cause &#8211; NA
fix &#8211; 不建什么代理服务了, 麻烦的要死, 写了个脚本做进程监控, 下文会提到


对于VPN帐号和新的SSH客户端的话, [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/general-technic/%e6%9c%ac%e5%9c%b0%e5%8a%a0%e5%af%86%e4%bb%a3%e7%90%86%e9%80%9a%e9%81%93%e5%8f%8a%e7%9b%b8%e5%85%b3%e5%ba%94%e7%94%a8reloaded.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>窗口和消息</title>
		<link>http://blog.lzp729.com/code-life/%e7%aa%97%e5%8f%a3%e5%92%8c%e6%b6%88%e6%81%af.html</link>
		<comments>http://blog.lzp729.com/code-life/%e7%aa%97%e5%8f%a3%e5%92%8c%e6%b6%88%e6%81%af.html#comments</comments>
		<pubDate>Mon, 05 Sep 2011 17:07:00 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Windows开发]]></category>
		<category><![CDATA[代码人生]]></category>
		<category><![CDATA[消息循环]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=150</guid>
		<description><![CDATA[
#include 
&#160;
LRESULT CALLBACK WndProc &#40;HWND, UINT, WPARAM, LPARAM&#41;;
&#160;
int WINAPI WinMain &#40;HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow&#41;
&#123;
	static TCHAR szAppName&#91;&#93; = TEXT &#40;&#34;HelloWin&#34;&#41; ;
&#160;
	HWND   hwnd ;
	MSG    msg ;
	WNDCLASS wndclass ;
&#160;
	wndclass.style        = CS_HREDRAW &#124; CS_VREDRAW ;
	wndclass.lpfnWndProc  = WndProc ;
	wndclass.cbClsExtra   = 0 [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/code-life/%e7%aa%97%e5%8f%a3%e5%92%8c%e6%b6%88%e6%81%af.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>教你如何从官网找到Windows Live 2011软件包的离线完整版的下载路径</title>
		<link>http://blog.lzp729.com/general-technic/%e6%95%99%e4%bd%a0%e5%a6%82%e4%bd%95%e4%bb%8e%e5%ae%98%e7%bd%91%e6%89%be%e5%88%b0windows-live-2011%e8%bd%af%e4%bb%b6%e5%8c%85%e7%9a%84%e7%a6%bb%e7%ba%bf%e5%ae%8c%e6%95%b4%e7%89%88%e7%9a%84%e4%b8%8b.html</link>
		<comments>http://blog.lzp729.com/general-technic/%e6%95%99%e4%bd%a0%e5%a6%82%e4%bd%95%e4%bb%8e%e5%ae%98%e7%bd%91%e6%89%be%e5%88%b0windows-live-2011%e8%bd%af%e4%bb%b6%e5%8c%85%e7%9a%84%e7%a6%bb%e7%ba%bf%e5%ae%8c%e6%95%b4%e7%89%88%e7%9a%84%e4%b8%8b.html#comments</comments>
		<pubDate>Sat, 09 Jul 2011 19:15:30 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[General technic]]></category>
		<category><![CDATA[15.4.3538.0513]]></category>
		<category><![CDATA[windows live 2011]]></category>
		<category><![CDATA[wlsetup-all]]></category>
		<category><![CDATA[完整]]></category>
		<category><![CDATA[离线]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=152</guid>
		<description><![CDATA[额。。。 好吧，我是个疯狂的软件新版跟随者和狂热的安装程序收集者。 -_-
今天Windows live 2011更新到新版15.4.3538.0513，当然更新，去官网下载，得到一个1M多点的wlsetup-web.exe程序，看大小就知道是要在线安装的，不爽，删之，把live.com网站翻了个边，没有找到记忆中的完整版下载的入口，无奈，小探索了下，发现了从官网找离线安装程序的办法，共享之。
从这里开始吧，打开http://explore.live.com/download-windows-live，可以选你要下载的语言，我选英文，你们自便。点English后会直接开始下载wlsetup-web.exe，当然这不是我要的，取消，复制下来English这个链接的地址是
http://g.live.com/1rewlive4-web/en/wlsetup-web.exe??WLI=1&#038;WLXID=0d769581-fba3-4a13-8c0d-c3172ab2baf7&#038;RID=00ef31a210c&#038;TID=1310237640105&#038;lid=
开始构造了，把后面那些记录下载量的东西都删掉得到

http://g.live.com/1rewlive4-web/en/wlsetup-web.exe
然后吧web换成all，得到
http://g.live.com/1rewlive4-all/en/wlsetup-all.exe
扔进迅雷，2分钟后下载完成，额。。。我是10M的

]]></description>
		<wfw:commentRss>http://blog.lzp729.com/general-technic/%e6%95%99%e4%bd%a0%e5%a6%82%e4%bd%95%e4%bb%8e%e5%ae%98%e7%bd%91%e6%89%be%e5%88%b0windows-live-2011%e8%bd%af%e4%bb%b6%e5%8c%85%e7%9a%84%e7%a6%bb%e7%ba%bf%e5%ae%8c%e6%95%b4%e7%89%88%e7%9a%84%e4%b8%8b.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UNICODE简介</title>
		<link>http://blog.lzp729.com/code-life/unicode%e7%ae%80%e4%bb%8b.html</link>
		<comments>http://blog.lzp729.com/code-life/unicode%e7%ae%80%e4%bb%8b.html#comments</comments>
		<pubDate>Mon, 06 Jun 2011 13:02:01 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Windows开发]]></category>
		<category><![CDATA[代码人生]]></category>
		<category><![CDATA[unicide]]></category>
		<category><![CDATA[windows api]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=149</guid>
		<description><![CDATA[
美国信息交换标准码（ASCII：American Standard Code for Information Interchange）起始于50年代后期，最后完成于1967年。有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格，总共128个字符码，共7位长。ASCII有许多优点。例如，26个字母代码是连续的；大写字母和小写字母可通过改变一位数据而相互转化；10个数字的代码可从数值本身方便地得到。

最初的IBM扩展字符集包括某些带重音的字符和一个小写希腊字母表（在数学符号中非常有用），还包括一些块型和线状图形字符。附加的字符也被添加到ASCII控制字符的编码位置，这是因为大多数控制字符都不是拿来显示用的。
Windows字符集被称作「ANSI字符集」。ANSI草案和ISO标准最终成为ANSI/ISO 8859-1-1987，即「American National Standard for Information Processing-8-Bit Single-Byte Coded Graphic Character Sets-Part 1: Latin Alphabet No 1」，通常也简写为「Latin 1」。

空方框表示该位置未定义字符。这与ANSI/ISO 8859-1的最终定义一致。ANSI/ISO 8859-1仅显示了图形字符，而没有控制字符，因此没有定义DEL。此外，代码0xA0定义为一个非断开的空格（这意味着在编排格式时，该字符不用于断开一行），代码0xAD是一个软连字符（表示除非在行尾断开单词时使用，否则不显示）。此外，ANSI/ISO 8859-1将代码0xD7定义为乘号（*），0xF7为除号（/）。Windows中的某些字体也定义了从0&#215;80到0x9F的某些字符，但这些不是ANSI/ISO 8859-1标准的一部分。
MS-DOS 3.3（1987年4月发行）向IBM PC用户引进了代码页（code page）的概念，Windows也使用此概念。代码页定义了字符的映像代码。最初的IBM字符集被称作代码页437，或者「MS-DOS Latin US）。代码页850就是「MS-DOS Latin 1」，它用附加的带重音字母（但不是Latin 1 ISO/ANSI标准）代替了一些线形字符。其它代码页被其它语言定义。最低的128个代码总是相同的；较高的128个代码取决于定义代码页的语言。
双字节字符集（DBCS：double-byte character set）。DBCS从256代码开始，就像ASCII一样。与任何行为良好的代码页一样，最初的128个代码是ASCII。然而，较高的128个代码中的某些总是跟随着第二个字节。这两个字节一起（称作首字节和跟随字节）定义一个字符，通常是一个复杂的象形文字。双字符集问题并不是说字符由两个字节代表。问题在于一些字符（特别是ASCII字符）由1个字节表示。这会引起附加的程序设计问题。例如，字符串中的字符数不能由字符串的字节数决定。必须剖析字符串来决定其长度，而且必须检查每个字节以确定它是否为双字节字符的首字节。如果有一个指向DBCS字符串中间的指针，那么该字符串前一个字符的地址是什么呢？惯用的解决方案是从开始的指针分析该字符串！
与混乱的256个字符代码映像，以及含有一些1字节代码和一些2字节代码的双字节字符集不同，Unicode是统一的16位系统，这样就允许表示65,536个字符。这对表示所有字符及世界上使用象形文字的语言，包括一系列的数学、符号和货币单位符号的集合来说是充裕的。前128个Unicode字符（16位代码从0&#215;0000到0x007F）就是ASCII字符，而接下来的128个Unicode字符（代码从0&#215;0080到0x00FF）是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。希腊字母表使用从0&#215;0370到0x03FF的代码，斯拉夫语使用从0&#215;0400到0x04FF的代码，美国使用从0&#215;0530到0x058F的代码，希伯来语使用从0&#215;0590到0x05FF的代码。中国、日本和韩国的象形文字（总称为CJK）占用了从0&#215;3000到0x9FFF的代码。
C语言中， 定义一个双字节的字符 wchar_t c = &#8216;A&#8217; 或者wchar_t c = L&#8217;A'， 其中的wchar_t为typedef unsigned short wchar_t ，定义于wchar.h，定义宽字符串的指针 wchar_t *p [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/code-life/unicode%e7%ae%80%e4%bb%8b.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows历史</title>
		<link>http://blog.lzp729.com/code-life/windows%e5%8e%86%e5%8f%b2.html</link>
		<comments>http://blog.lzp729.com/code-life/windows%e5%8e%86%e5%8f%b2.html#comments</comments>
		<pubDate>Wed, 18 May 2011 14:05:15 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Windows开发]]></category>
		<category><![CDATA[代码人生]]></category>
		<category><![CDATA[windows api]]></category>
		<category><![CDATA[发展史]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=147</guid>
		<description><![CDATA[
70年代中期,Xerox Palo Alto Research Center（PARC）作的图形环境开拓性研究工作
	1981年秋天,IBM推出PC
	1983年1月,苹果计算机公司发表Lisa计算机
	1983年11月,Windows 1.0,之后，又推出了几种改进版本，以支持国际商业市场，并提供新型视讯显示器和打印机的驱动程序
	1984年1月,Lisa成为Macintosh上图形环境的一种标准
	1987年11月,Windows 2.0,改进中最有效的是使用了可重迭式窗口,还增强了键盘和鼠标接口，特别是加入了菜单和对话框
	1987年末,Microsoft和IBM合作开发的OS/2版本1.0
	1988年10月,OS/2版本1.1中出现了管理图形使用者接口的PM(Presentation Manager),PM最初的设计构想是成为Windows的一种保护模式版本
	至此，Windows还只要求Intel 8086或者8088等级的微处理器，以「实际模式」执行，只能存取地址在1MB以下的内存
	Windows/386（在Windows 2.0之后不久发行的）使用Intel 386微处理器的「虚拟8086」模式，实现将直接存取硬件的多个MS-DOS程序窗口化和多任务化,Windows版本2.1被更名为Windows/286
	1990年5月22日,Windows 3.0,改变就是对Intel的286、386和486微处理器保护模式的支持,能使Windows和Windows应用程序能存取高达16MB的内存,Windows用于执行程序和维护文件的「外壳」程序得到了全面的改进
	1990年9月，IBM接管了OS/2
	1992年4月,Windows 3.1,重要特性是TrueType字体技术（给Windows带来可缩放的轮廓字体)、多媒体（声音和音乐)、对象连结和嵌入（OLE：Object Linking and Embedding）和通用对话框,Windows 3.1只能在保护模式下运作，并且要求至少配置了1MB内存的286或386处理器
	1993年7月,Windows NT,支持Intel 386、486和Pentium微处理器32位保护模式,Windows NT提供32位平坦寻址,并使用32位的指令集,可以移植到非Intel处理器上,并在几种使用RISC芯片的工作站上执行
	1995年8月,Windows 95,缺少Windows NT中的某些功能,诸如高安全性和对RISC机器的可移植性等
	1998年6月,Windows 98,具有许多加强功能,包括执行效能的提高、更好的硬件支持以及与因特网和全球信息网（WWW）更紧密的结合
Windows 98和Windows NT都是支持32位优先权式多任务（preemptive multitasking）及多线程的图形操作系统,Windows的早期版本使用一种「非优先权式（non-preemptive）」的多任务系统,意味着Windows不使用系统定时器将处理时间分配给系统中运行的多个应用程序，程序必须自愿放弃控制以便其它程序运行
Windows 1.0中，PC硬件结构的640KB内存限制，在不要求任何额外内存的情况下被有效地扩展了。但Microsoft并未就此停步：Windows 2.0允许Windows应用程序存取扩充内存（EMS）；Windows 3.0在保护模式下，允许Windows应用程序存取高达16MB的扩展内存。Windows NT和Windows 98通过成熟的32位操作系统及平坦寻址空间，摆脱了这些旧的限制
Windows运作机制的核心是一个称作「动态链接」的概念,早期,Windows的主要部分仅通过三个动态链接库实作,称作Kernel、User和GDI. Kernel（日前由16位的KRNL386.EXE和32位的KERNEL32.DLL实现）处理所有在传统上由操作系统核心处理的事务－内存管理、文件I/O和多任务管理. User（由16位的USER.EXE和32位的USER32.DLL实作）指使用者接口,实作所有窗口运作机制. GDI（由16位的GDI.EXE和32位的GDI32.DLL实作）是一个图形设备接口,允许程序在屏幕和打印机上显示文字和图形
在Windows NT中，Win16函数呼叫通过一个转换层被转化为Win32函数呼叫，然后被操作系统处理。在Windows 95和Windows 98中，该操作正相反：Win32函数呼叫通过转换层转换为Win16函数呼叫，再由操作系统处理
Sample

#include &#60;windows.h&#62;
&#160;
int WINAPI WinMain &#40;HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow&#41;
&#160;
&#123;
&#160;
	MessageBox &#40;NULL, TEXT &#40;&#34;Hello, Windows 98!&#34;&#41;, TEXT &#40;&#34;HelloMsg&#34;&#41;, [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/code-life/windows%e5%8e%86%e5%8f%b2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>windows live messenger 2011 假死, 停止响应的解决办法</title>
		<link>http://blog.lzp729.com/general-technic/windows-live-messenger-2011-%e5%81%87%e6%ad%bb-%e5%81%9c%e6%ad%a2%e5%93%8d%e5%ba%94%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95.html</link>
		<comments>http://blog.lzp729.com/general-technic/windows-live-messenger-2011-%e5%81%87%e6%ad%bb-%e5%81%9c%e6%ad%a2%e5%93%8d%e5%ba%94%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95.html#comments</comments>
		<pubDate>Sun, 13 Mar 2011 03:49:28 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[General technic]]></category>
		<category><![CDATA[messenger 2011]]></category>
		<category><![CDATA[假死]]></category>
		<category><![CDATA[停止响应]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=144</guid>
		<description><![CDATA[近日发布了win7 sp1, 于是借机重装系统, 也升级了一些常用软件, 如windows live messenger 2011
但新装的windows live messenger 2011在新安装的系统上每次登录后都会假死, 我相信我的情况不是个案, 尝试了在网上找到了多种解决方案, 改注册表啦, 设置IE带啦, 改host文件啦, 毫无疑问的全部无效.
我自己做了一些尝试, 最终找到了一个解决方案, 在这里share给大家.
我的系统是win7 sp1 64bit
先安装老版的messenger 2009(v14.0.8117.416), 英文完整版下载地址点这里
然后用这个老版的登录一次.
再安装新版的messenger 2011(v15.4.3508.1109), 英文完整版下载地址点这里, 安装时会提示将更新已安装的老版messenger
更新后会提示要求重启, 重启之前最好把DX更新到最新
重启后就可以正常登录了.
]]></description>
		<wfw:commentRss>http://blog.lzp729.com/general-technic/windows-live-messenger-2011-%e5%81%87%e6%ad%bb-%e5%81%9c%e6%ad%a2%e5%93%8d%e5%ba%94%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python知识整理 (25) 异常</title>
		<link>http://blog.lzp729.com/code-life/python/python-groundwork/ython%e7%9f%a5%e8%af%86%e6%95%b4%e7%90%86-25-%e5%bc%82%e5%b8%b8.html</link>
		<comments>http://blog.lzp729.com/code-life/python/python-groundwork/ython%e7%9f%a5%e8%af%86%e6%95%b4%e7%90%86-25-%e5%bc%82%e5%b8%b8.html#comments</comments>
		<pubDate>Thu, 23 Dec 2010 17:33:26 +0000</pubDate>
		<dc:creator>lzp729</dc:creator>
				<category><![CDATA[Python知识整理]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[知识整理]]></category>

		<guid isPermaLink="false">http://blog.lzp729.com/?p=137</guid>
		<description><![CDATA[
Python的异常语句形式

try:                  #进入异常管理的范围
	&#60;statement&#62;
except &#60;excp1&#62;:       #捕获异常1
	&#60;statement&#62;
except &#60;excp2&#62;:       #捕获异常2
	&#60;statement&#62;
except:               #捕获所有异常
	&#60;statement&#62;
else:      [...]]]></description>
		<wfw:commentRss>http://blog.lzp729.com/code-life/python/python-groundwork/ython%e7%9f%a5%e8%af%86%e6%95%b4%e7%90%86-25-%e5%bc%82%e5%b8%b8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

