<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title>
<![CDATA[WoodPecker]]></title>
 <link>
http://plikefly.blogcn.com</link>
<description>
<![CDATA[<font size="4" color = "0080FF" face = "黑体"><b>我们痛苦，所以幽默；我们幽默，所以快乐...</b></font>]]></description>
<managingEditor>
<![CDATA[plikefly]]></managingEditor>
<dc:creator>
<![CDATA[plikefly]]></dc:creator>
<blogcn_uid>
plikefly</blogcn_uid>
<blogcn_hits>
1044</blogcn_hits>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[db2字符串的有关函数和具体用法【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10407394.shtml</link>
<description>
<![CDATA[<P align=left><BR>from :internet<BR>&nbsp;<BR><FONT size=3><STRONG>一、字符转换函数</STRONG></FONT></P>
<P align=left>&nbsp;1、ASCII()<BR>&nbsp;&nbsp;返回字符表达式最左端字符的ASCII 码值。在ASCII（）函数中，纯数字的字符串可不用‘’括起来，但含其它字符的字符串必须用‘’括起来使用，否则会出错。<BR>&nbsp;<BR>&nbsp;2、CHAR()<BR>&nbsp;&nbsp;将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值，CHAR（） 返回NULL 。<BR>&nbsp;<BR>&nbsp;3、LOWER()和UPPER()<BR>&nbsp;&nbsp;LOWER()将字符串全部转为小写；UPPER()将字符串全部转为大写。<BR>&nbsp;<BR>&nbsp;4、STR()<BR>&nbsp;&nbsp;把数值型数据转换为字符型数据。<BR>&nbsp;&nbsp;STR (&lt;float_expression&gt;[，length[， &lt;decimal&gt;]])<BR>&nbsp;&nbsp;length 指定返回的字符串的长度，decimal 指定返回的小数位数。如果没有指定长度，缺省的length 值为10， decimal 缺省值为0。<BR>&nbsp;&nbsp;当length 或者decimal 为负值时，返回NULL；<BR>&nbsp;&nbsp;当length 小于小数点左边（包括符号位）的位数时，返回length 个*；<BR>&nbsp;&nbsp;先服从length ，再取decimal ；<BR>&nbsp;&nbsp;当返回的字符串位数小于length ，左边补足空格。</P>
<P align=left><FONT size=3><STRONG>二、去空格函数</STRONG></FONT></P>
<P align=left>&nbsp;1、LTRIM() 把字符串头部的空格去掉。<BR>&nbsp;<BR>&nbsp;2、RTRIM() 把字符串尾部的空格去掉。</P>
<P align=left><FONT size=3><STRONG>三、取子串函数</STRONG></FONT></P>
<P align=left>&nbsp;1、left()<BR>&nbsp;&nbsp;LEFT (&lt;character_expression&gt;， &lt;integer_expression&gt;)<BR>&nbsp;&nbsp;返回character_expression 左起 integer_expression 个字符。<BR>&nbsp;<BR>&nbsp;2、RIGHT()<BR>&nbsp;&nbsp;RIGHT (&lt;character_expression&gt;， &lt;integer_expression&gt;)<BR>&nbsp;&nbsp;返回character_expression 右起 integer_expression 个字符。<BR>&nbsp;<BR>&nbsp;3、SUBSTRING()<BR>&nbsp;&nbsp;SUBSTRING (&lt;expression&gt;， &lt;starting_ position&gt;， length)<BR>&nbsp;&nbsp;返回从字符串左边第starting_ position 个字符起length个字符的部分。</P>
<P align=left><FONT size=3><STRONG>四、字符串比较函数</STRONG></FONT></P>
<P align=left>&nbsp;1、CHARINDEX()<BR>&nbsp;&nbsp;返回字符串中某个指定的子串出现的开始位置。<BR>&nbsp;&nbsp;CHARINDEX (&lt;’substring_expression’&gt;， &lt;expression&gt;)<BR>&nbsp;&nbsp;其中substring _expression 是所要查找的字符表达式，expression 可为字符串也可为列名表达式。如果没有发现子串，则返回0 值。<BR>&nbsp;&nbsp;此函数不能用于TEXT 和IMAGE 数据类型。<BR>&nbsp;<BR>&nbsp;2、PATINDEX()<BR>&nbsp;&nbsp;返回字符串中某个指定的子串出现的开始位置。<BR>&nbsp;&nbsp;PATINDEX (&lt;’%substring _expression%’&gt;， &lt;column_ name&gt;)其中子串表达式前后必须有百分号“%”否则返回值为0。<BR>&nbsp;&nbsp;与CHARINDEX 函数不同的是，PATINDEX函数的子串中可以使用通配符，且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。<BR>&nbsp;<BR><FONT size=3><STRONG>五、字符串操作函数</STRONG></FONT><BR><BR>&nbsp;1、QUOTENAME()<BR>&nbsp;&nbsp;返回被特定字符括起来的字符串。<BR>&nbsp;&nbsp;QUOTENAME (&lt;’character_expression’&gt;[， quote_ character]) 其中quote_ character 标明括字符串所用的字符，缺省值为“[]”。<BR>&nbsp;<BR>&nbsp;2、REPLICATE()<BR>&nbsp;&nbsp;返回一个重复character_expression 指定次数的字符串。<BR>&nbsp;&nbsp;REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值，则返回NULL 。<BR>&nbsp;<BR>&nbsp;3、REVERSE()<BR>&nbsp;&nbsp;将指定的字符串的字符排列顺序颠倒。<BR>&nbsp;&nbsp;REVERSE (&lt;character_expression&gt;) 其中character_expression 可以是字符串、常数或一个列的值。<BR>&nbsp;<BR>&nbsp;4、REPLACE()<BR>&nbsp;&nbsp;返回被替换了指定子串的字符串。<BR>&nbsp;&nbsp;REPLACE (&lt;string_expression1&gt;， &lt;string_expression2&gt;， &lt;string_expression3&gt;) 用string_expression3 替换在string_expression1 中的子串string_expression2。<BR>&nbsp;<BR>&nbsp;4、SPACE()<BR>&nbsp;&nbsp;返回一个有指定长度的空白字符串。<BR>&nbsp;&nbsp;SPACE (&lt;integer_expression&gt;) 如果integer_expression 值为负值，则返回NULL 。<BR>&nbsp;<BR>&nbsp;5、STUFF()<BR>&nbsp;&nbsp;用另一子串替换字符串指定位置、长度的子串。<BR>&nbsp;&nbsp;STUFF (&lt;character_expression1&gt;， &lt;start_ position&gt;， &lt;length&gt;，&lt;character_expression2&gt;)<BR>&nbsp;&nbsp;如果起始位置为负或长度值为负，或者起始位置大于character_expression1 的长度，则返回NULL 值。<BR>&nbsp;&nbsp;如果length 长度大于character_expression1 中 start_ position 以右的长度，则character_expression1 只保留首字符。</P>
<P align=left><FONT size=3><STRONG>六、数据类型转换函数</STRONG></FONT></P>
<P align=left>1、CAST()<BR>&nbsp;CAST (&lt;expression&gt; AS &lt;data_ type&gt;[ length ])<BR>&nbsp;<BR>&nbsp;2、CONVERT()<BR>&nbsp;CONVERT (&lt;data_ type&gt;[ length ]， &lt;expression&gt; [， style])&nbsp;<BR>&nbsp;&nbsp;1）data_type为SQL Server系统定义的数据类型，用户自定义的数据类型不能在此使用。<BR>&nbsp;&nbsp;2）length用于指定数据的长度，缺省值为30。<BR>&nbsp;&nbsp;3）把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。<BR>&nbsp;&nbsp;4）TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符，即CHAR或VARCHAR数据类型是最大长度。<BR>&nbsp;&nbsp;5）IMAGE类型存储的数据转换到BINARY或VARBINARY类型，最多为8000个字符。<BR>&nbsp;&nbsp;6）把整数值转换为MONEY或SMALLMONEY类型，按定义的国家的货币单位来处理，如人民币、美元、英镑等。<BR>&nbsp;&nbsp;7）BIT类型的转换把非零值转换为1，并仍以BIT类型存储。<BR>&nbsp;&nbsp;8）试图转换到不同长度的数据类型，会截短转换值并在转换值后显示“+”，以标识发生了这种截断。<BR>&nbsp;&nbsp;9）用CONVERT（） 函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号，不同的样式编号有不同的输出格式。</P>
<P align=left><FONT size=3><STRONG>七、日期函数</STRONG></FONT></P>
<P align=left>&nbsp;1、day(date_expression)<BR>&nbsp;&nbsp;返回date_expression中的日期值<BR>&nbsp;<BR>&nbsp;2、month(date_expression)<BR>&nbsp;&nbsp;返回date_expression中的月份值<BR>&nbsp;<BR>&nbsp;3、year(date_expression)<BR>&nbsp;&nbsp;返回date_expression中的年份值<BR>&nbsp;<BR>&nbsp;4、DATEADD()<BR>&nbsp;&nbsp;DATEADD (&lt;datepart&gt;， &lt;number&gt;， &lt;date&gt;)<BR>&nbsp;&nbsp;返回指定日期date 加上指定的额外日期间隔number 产生的新日期。<BR>&nbsp;<BR>&nbsp;5、DATEDIFF()<BR>&nbsp;&nbsp;DATEDIFF (&lt;datepart&gt;， &lt;date1&gt;， &lt;date2&gt;)<BR>&nbsp;&nbsp;返回两个指定日期在datepart 方面的不同之处，即date2 超过date1的差距值，其结果值是一个带有正负号的整数值。<BR>&nbsp;<BR>&nbsp;6、DATENAME()<BR>&nbsp;&nbsp;DATENAME (&lt;datepart&gt;， &lt;date&gt;)<BR>&nbsp;&nbsp;以字符串的形式返回日期的指定部分此部分。由datepart 来指定。<BR>&nbsp;<BR>&nbsp;7、DATEPART()<BR>&nbsp;&nbsp;DATEPART (&lt;datepart&gt;， &lt;date&gt;)<BR>&nbsp;&nbsp;以整数值的形式返回日期的指定部分。此部分由datepart 来指定。<BR>&nbsp;&nbsp;DATEPART (dd， date) 等同于DAY (date)<BR>&nbsp;&nbsp;DATEPART (mm， date) 等同于MONTH (date)<BR>&nbsp;&nbsp;DATEPART (yy， date) 等同于YEAR (date)<BR>&nbsp;<BR>&nbsp;8、GETDATE()<BR>&nbsp;&nbsp;以DATETIME 的缺省格式返回系统当前的日期和时间</P>
<P align=left>&nbsp;</P>]]></description>
<pubDate>
2007-09-11 09:07:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10407394.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10407394.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[上海个人所得税计算方法【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10313800.shtml</link>
<description>
<![CDATA[<P><BR>2007年03月28日&nbsp;星期三&nbsp;15:38个人所得税的计算方法：&nbsp;<BR>需要缴税的金额X&nbsp;=&nbsp;工资&nbsp;－&nbsp;四金基数*18%&nbsp;－1600(2006年全国统一提高缴税起点)&nbsp;<BR>1－500元，扣税比率为5％；&nbsp;<BR>500－2000元，扣税比率为10％；&nbsp;<BR>2000－5000元，扣率比率为15％&nbsp;<BR>5000－20000元，扣率比率为20％&nbsp;<BR>注意，是分段扣税的，就是说如果X&nbsp;＝&nbsp;4000，那么要缴纳的个人所得税&nbsp;＝&nbsp;500*5%&nbsp;+&nbsp;1500*10%&nbsp;+&nbsp;2000*15%&nbsp;=&nbsp;475&nbsp;<BR>1.四金的缴费基数的定义：&nbsp;<BR>一般四金基数就是当月的工资，不过如果工资很高(比如超过了上年你所在城市社会月平均工资的三倍)，那基数就到顶了。而如果工资特别低的话(比如低于上年你所在城市社会月平均工资的百分之六十)，那基数也有封底。&nbsp;<BR>上海市2004年的情况为例，2003年社会月平均工资是1847元。如果你的月工资超过1847×3=5541元。则四金基数是5541元；如果你的月工资低于1847*60%=1108.2元。则四金基数是1108.2元。要是工资在1108.2元到5541元之间，那基数就是你的工资。&nbsp;</P>
<P>2.四金缴费的比例：&nbsp;<BR>四金缴费比例：&nbsp;个人缴纳部分&nbsp;公司缴纳部分&nbsp;<BR>&gt;&gt;&gt;&gt;养老保险金＝&nbsp;基数×8%&nbsp;＋&nbsp;基数×22%(好像最近才改成这个比例了)&nbsp;<BR>&gt;&gt;&gt;&gt;医疗保险金＝&nbsp;基数×2%&nbsp;＋&nbsp;基数×12%&nbsp;<BR>&gt;&gt;&gt;&gt;失业保险金＝&nbsp;基数×1%&nbsp;＋&nbsp;基数×2%&nbsp;<BR>&gt;&gt;&gt;&gt;住房公积金＝&nbsp;基数×7%&nbsp;＋&nbsp;基数×7%&nbsp;<BR>&gt;&gt;&nbsp;其中个人出的部分是左边的部分，即基数的8%+2%+1%+7%=18%,其余右边的部分由公司出，其总数为基数的22%+12%+2%+7%=43%。也就是说扣除四金后的工资为：X＝工人工资－基数×18％，（下面要以扣除四金后的工资X计算所得税）。而单位付出的总资金为：Y＝工人工资＋基数×43％。&nbsp;</P>
<P>3.个人所得税的计算方法：&nbsp;<BR>需要缴税的金额X&nbsp;=&nbsp;工资&nbsp;－&nbsp;四金基数*18%&nbsp;－1600(2006年全国统一提高缴税起点)&nbsp;<BR>1－500元，扣税比率为5％；&nbsp;<BR>500－2000元，扣税比率为10％；&nbsp;<BR>2000－5000元，扣率比率为15％&nbsp;<BR>5000－20000元，扣率比率为20％&nbsp;<BR>注意，是分段扣税的，就是说如果X&nbsp;＝&nbsp;4000，那么要缴纳的个人所得税&nbsp;＝&nbsp;500*5%&nbsp;+&nbsp;1500*10%&nbsp;+&nbsp;2000*15%&nbsp;=&nbsp;475&nbsp;</P>
<P>4.&nbsp;奖金的计算方法：&nbsp;<BR>奖金计入当月工资，累加后按方法3扣税。年终双薪也同样。?个人所得税是对个人（自然人）取得的各项应税所得征收的一种税。&nbsp;1.纳税义务人&nbsp;(1)从中国境内和境外取得所得的中国公民和个体工商户；&nbsp;<BR>(2)在中国境内居住满一年，从中国境内和境外取得所得的满、澳、台同胞和华侨，以及外籍人员；&nbsp;<BR>(3)在中国境内居住不满一年，从中国境内取得所的满、澳、台同胞和华侨，以及外籍人员。&nbsp;<BR>2.扣缴义务人&nbsp;个人所得税以支付所得的单位或者个人为扣缴义务人，即凡是支付个人应税所得的企业、国家机关、政党机关、事业单位、社会团体、民办非企业单位及其他组织或者个人，均为个人所得的扣缴义务人。个人所得税的扣缴义务人，必须按照税法规定代扣代缴个人所得税，并向主管地方税务征收机关（以下简称税务机关）领取代扣代缴税款凭证，填开给纳税人，同时在规定期限内向税务机关报送“代扣个人所得税及支付个人所得税报告表”（见附表）和汇总交纳代扣的税款。税务机关按照代缴义务人所扣缴的税款，付给2％的手续费。&nbsp;纳税人拒绝扣缴义务人依法履行扣缴义务时，扣缴义务人应当在24小时内书面报告税务机关处理。但扣缴义务人拒不履行代扣代缴义务或违反税法规定，税务机关有权按照《中华人民共和国税收征收管理法》有关规定予以处罚。&nbsp;3.应税项目&nbsp;个人所得税的应税项目包括下列11项：&nbsp;(1)工资、薪金所得；&nbsp;(2)个体工商户的生产、经营所得；&nbsp;(3)对企事业承包经营、承租经营所得；&nbsp;(4)劳务报酬所得；&nbsp;(5)稿酬所得；&nbsp;(6)特许权使用费所得；&nbsp;(7)利息、股息、红利所得；&nbsp;(8)财产租凭所得；&nbsp;(9)财产转让所得；&nbsp;(10)偶然所得；&nbsp;(11)经国务院财政部门确定征税的其它所得。&nbsp;4.税率&nbsp;个人所得税按所得性质的不同，适用不同的税率。&nbsp;(1)工资，薪金所得，适用5%-45%的九级超额累进税率。（税率表见下表）&nbsp;每月当市民取得工资、薪金收入后，先减去个人承担的基本养老保险金、医疗保险金、失业保险金，以及按省级政府规定标准缴纳的住房公积金，再减去费用扣除额1600元／月（有的地方适用其他标准）为应纳税所得额，按5％至45％的九级超额累进税率计算缴纳个人所得税。&nbsp;<BR>计算公式是：应纳个人所得税税额＝应纳税所得额×适用税率一速算扣除数&nbsp;级数&nbsp;全月应纳税所得额&nbsp;税率%&nbsp;速算扣除法(元)&nbsp;<BR>1&nbsp;不超过500元的&nbsp;5&nbsp;0&nbsp;<BR>2&nbsp;超过500元至2,000元的部分&nbsp;10&nbsp;25&nbsp;<BR>3&nbsp;超过2,000元至5,000元的部分&nbsp;15&nbsp;125&nbsp;<BR>4&nbsp;超过5,000元至20,000元的部分&nbsp;20&nbsp;375&nbsp;<BR>5&nbsp;超过20,000元至40,000元的部分&nbsp;25&nbsp;1375&nbsp;<BR>6&nbsp;超过40,000元至60,000元的部分&nbsp;30&nbsp;3375&nbsp;<BR>7&nbsp;超过60,000元至80,000元的部分&nbsp;35&nbsp;6375&nbsp;<BR>8&nbsp;超过80,000元至100,000元的部分&nbsp;40&nbsp;10375&nbsp;<BR>9&nbsp;超过100,000元的部分&nbsp;45&nbsp;15375&nbsp;<BR>举个例子吧：&nbsp;<BR>月收入1600，则1600-1600=0，不交税&nbsp;<BR>月收入2000，则（2000-1600）*5%=20，因为2000-1600〈500，所以按5%计算&nbsp;<BR>月收入3000，则（3000-1600）*10%-25=115，因为3000-1600大于500小于2000，所以按10%计算后再扣除速算的部分。&nbsp;<BR>上面的例子中，每次计算时首先扣除的1600就是扣除标准，是国家规定的。&nbsp;<BR>扣除后的数字如果小于500元就按5%税率计算个调税。如果大于500小于2000按10%计算，然后再扣除25元，这里的25元就是速算扣除数。具体明细楼上已经说的很清楚了，依次类推。&nbsp;首先，四金计算需要有工资基数，但工资基数是有上下限的，2006年交金的下限是1341，上限是6705，&nbsp;就是说，工资在1341到6705之间的，计算基数就是你的实际工资；如果超出范围，比如工&nbsp;资超过6705，就是按6705来计算四金；或是工资低于1341，就是按1341来计算四金。&nbsp;</P>
<P>其次，四金主要是指：养老保险金，医疗保险金，失业保险金，住房公积金。具体的缴纳&nbsp;比率是：&nbsp;</P>
<P>个人缴纳部分&nbsp;公司缴纳部分&nbsp;<BR>养老保险金&nbsp;工资×8%&nbsp;工资×22.5%&nbsp;<BR>医疗保险金&nbsp;工资×2%&nbsp;工资×12%&nbsp;<BR>失业保险金&nbsp;工资×1%&nbsp;工资×2%&nbsp;<BR>住房公积金&nbsp;工资×7%&nbsp;工资×7%&nbsp;</P>
<P>左边的部分是你个人交纳的部分&nbsp;</P>
<P>右边的部分是单位帮你交纳的部分&nbsp;</P>
<P>除去四金后的工资＝工资－所有的左边部分相加的和</P>
<P>另外，现在又多了一金，叫工伤保险（0.5％），不过个人不用交纳，全部由公司支付。&nbsp;</P>
<P>一般你的四金基数就是你当月的工资，不过如果工资很高(比如超过了上年你所在城市社会月平均工资的三倍），那基数就到顶了。而如果工资特别低的话（比如低于上年你所在城市社会月平均工资的百分之六十），那基数也有封底。&nbsp;</P>]]></description>
<pubDate>
2007-09-07 14:20:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10313800.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10313800.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[对synchronized(this)的一些理解 【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10312557.shtml</link>
<description>
<![CDATA[一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。&nbsp; 
<P>二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。&nbsp;&nbsp;</P>
<P>三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。&nbsp;&nbsp;</P>
<P>四、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。&nbsp;&nbsp;</P>
<P>五、以上规则对其它对象锁同样适用.&nbsp;</P>
<P>举例说明：&nbsp;&nbsp;</P>
<P>一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。&nbsp;&nbsp;</P>
<P>package ths; </P>
<P>public class Thread1 implements Runnable { <BR>public void run() { <BR>synchronized(this) { <BR>for (int i = 0; i &lt; 5; i++) { <BR>System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); <BR>} <BR>} <BR>} <BR>public static void main(String[] args) { <BR>Thread1 t1 = new Thread1(); <BR>Thread ta = new Thread(t1, "A"); <BR>Thread tb = new Thread(t1, "B"); <BR>ta.start(); <BR>tb.start(); <BR>} <BR>}&nbsp;&nbsp;</P>
<P>结果：&nbsp;</P>
<P>A synchronized loop 0 <BR>A synchronized loop 1 <BR>A synchronized loop 2 <BR>A synchronized loop 3 <BR>A synchronized loop 4 <BR>B synchronized loop 0 <BR>B synchronized loop 1 <BR>B synchronized loop 2 <BR>B synchronized loop 3 <BR>B synchronized loop 4&nbsp;&nbsp;</P>
<P>二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。&nbsp;</P>
<P>package ths; </P>
<P>public class Thread2 { <BR>public void m4t1() { <BR>synchronized(this) { <BR>int i = 5; <BR>while( i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : " + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch (InterruptedException ie) { <BR>} <BR>} <BR>} <BR>} <BR>public void m4t2() { <BR>int i = 5; <BR>while( i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : " + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch (InterruptedException ie) { <BR>} <BR>} <BR>} <BR>public static void main(String[] args) { <BR>final Thread2 myt2 = new Thread2(); <BR>Thread t1 = new Thread( <BR>new Runnable() { <BR>public void run() { <BR>myt2.m4t1(); <BR>} <BR>}, "t1" <BR>); <BR>Thread t2 = new Thread( <BR>new Runnable() { <BR>public void run() { <BR>myt2.m4t2(); <BR>} <BR>}, "t2" <BR>); <BR>t1.start(); <BR>t2.start(); <BR>} <BR>}&nbsp;&nbsp;</P>
<P>结果：&nbsp;</P>
<P>t1 : 4 <BR>t2 : 4 <BR>t1 : 3 <BR>t2 : 3 <BR>t1 : 2 <BR>t2 : 2 <BR>t1 : 1 <BR>t2 : 1 <BR>t1 : 0 <BR>t2 : 0&nbsp;&nbsp;</P>
<P>三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。&nbsp;</P>
<P>//修改Thread2.m4t2()方法： </P>
<P>public void m4t2() { <BR>synchronized(this) { <BR>int i = 5; <BR>while( i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : " + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch (InterruptedException ie) { <BR>} <BR>} <BR>} </P>
<P>}&nbsp;</P>
<P>结果：&nbsp;</P>
<P>t1 : 4 <BR>t1 : 3 <BR>t1 : 2 <BR>t1 : 1 <BR>t1 : 0 <BR>t2 : 4 <BR>t2 : 3 <BR>t2 : 2 <BR>t2 : 1 <BR>t2 : 0 </P>
<P>&nbsp;</P>
<P>四、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 </P>
<P>&nbsp;</P>
<P>//修改Thread2.m4t2()方法如下： </P>
<P>public synchronized void m4t2() { <BR>int i = 5; <BR>while( i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : " + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch (InterruptedException ie) { <BR>} <BR>} <BR>} </P>
<P>&nbsp;</P>
<P>结果： </P>
<P>&nbsp;</P>
<P>t1 : 4 <BR>t1 : 3 <BR>t1 : 2 <BR>t1 : 1 <BR>t1 : 0 <BR>t2 : 4 <BR>t2 : 3 <BR>t2 : 2 <BR>t2 : 1 <BR>t2 : 0 </P>
<P>&nbsp;</P>
<P>五、以上规则对其它对象锁同样适用: </P>
<P>&nbsp;</P>
<P>package ths; </P>
<P>public class Thread3 { <BR>class Inner { <BR>private void m4t1() { <BR>int i = 5; <BR>while(i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch(InterruptedException ie) { <BR>} <BR>} <BR>} <BR>private void m4t2() { <BR>int i = 5; <BR>while(i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch(InterruptedException ie) { <BR>} <BR>} <BR>} <BR>} <BR>private void m4t1(Inner inner) { <BR>synchronized(inner) { //使用对象锁 <BR>inner.m4t1(); <BR>} <BR>} <BR>private void m4t2(Inner inner) { <BR>inner.m4t2(); <BR>} <BR>public static void main(String[] args) { <BR>final Thread3 myt3 = new Thread3(); <BR>final Inner inner = myt3.new Inner(); <BR>Thread t1 = new Thread( <BR>new Runnable() { <BR>public void run() { <BR>myt3.m4t1(inner); <BR>} <BR>}, "t1" <BR>); <BR>Thread t2 = new Thread( <BR>new Runnable() { <BR>public void run() { <BR>myt3.m4t2(inner); <BR>} <BR>}, "t2" <BR>); <BR>t1.start(); <BR>t2.start(); <BR>} <BR>} </P>
<P>&nbsp;结果： </P>
<P>尽管线程t1获得了对Inner的对象锁，但由于线程t2访问的是同一个Inner中的非同步部分。所以两个线程互不干扰。 </P>
<P>&nbsp;t1 : Inner.m4t1()=4 <BR>t2 : Inner.m4t2()=4 <BR>t1 : Inner.m4t1()=3 <BR>t2 : Inner.m4t2()=3 <BR>t1 : Inner.m4t1()=2 <BR>t2 : Inner.m4t2()=2 <BR>t1 : Inner.m4t1()=1 <BR>t2 : Inner.m4t2()=1 <BR>t1 : Inner.m4t1()=0 <BR>t2 : Inner.m4t2()=0 </P>
<P>&nbsp;现在在Inner.m4t2()前面加上synchronized： </P>
<P>&nbsp;private synchronized void m4t2() { <BR>int i = 5; <BR>while(i-- &gt; 0) { <BR>System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i); <BR>try { <BR>Thread.sleep(500); <BR>} catch(InterruptedException ie) { <BR>} <BR>} <BR>} </P>
<P>&nbsp;结果： </P>
<P>尽管线程t1与t2访问了同一个Inner对象中两个毫不相关的部分,但因为t1先获得了对Inner的对象锁，所以t2对Inner.m4t2()的访问也被阻塞，因为m4t2()是Inner中的一个同步方法。 </P>
<P>&nbsp;t1 : Inner.m4t1()=4 <BR>t1 : Inner.m4t1()=3 <BR>t1 : Inner.m4t1()=2 <BR>t1 : Inner.m4t1()=1 <BR>t1 : Inner.m4t1()=0 <BR>t2 : Inner.m4t2()=4 <BR>t2 : Inner.m4t2()=3 <BR>t2 : Inner.m4t2()=2 <BR>t2 : Inner.m4t2()=1 <BR>t2 : Inner.m4t2()=0 <BR></P>]]></description>
<pubDate>
2007-09-07 13:22:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10312557.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10312557.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[java中synchronized用法【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10309334.shtml</link>
<description>
<![CDATA[<A href="http://hi.baidu.com/sunshibing/blog/item/5235b9b731d48ff430add14a.html">http://hi.baidu.com/sunshibing/blog/item/5235b9b731d48ff430add14a.html</A><BR><BR>synchronized的一个简单例子<BR><BR>public class TextThread<BR>{<BR><BR>&nbsp;/**<BR>&nbsp; * @param args<BR>&nbsp; */<BR>&nbsp;public static void main(String[] args)<BR>&nbsp;{<BR>&nbsp; // TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TxtThread tt = new TxtThread();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Thread(tt).start();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Thread(tt).start();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Thread(tt).start();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Thread(tt).start();<BR>&nbsp;}<BR>}<BR><BR>class TxtThread implements Runnable<BR>{<BR>&nbsp;int num = 100;<BR>&nbsp;String str = new String();<BR>&nbsp;public void run()<BR>&nbsp;{<BR>&nbsp; while (true)<BR>&nbsp; {<BR>&nbsp;&nbsp; synchronized(str)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp; if (num&gt;0)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(10);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; System.out.println(Thread.currentThread().getName()+ "this is "+ num--);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp; }<BR>&nbsp;}<BR>}<BR><BR>上面的例子中为了制造一个时间差,也就是出错的机会,使用了Thread.sleep(10)<BR><BR>Java对多线程的支持与同步机制深受大家的喜爱，似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何？――还得对synchronized关键字的作用进行深入了解才可定论。<BR><BR>总的说来，synchronized关键字可以作为函数的修饰符，也可作为函数内的语句，也就是平时说的同步方法和同步语句块。如果再细的分类，synchronized可作用于instance变量、object reference（对象引用）、static函数和class literals(类名称字面常量)身上。<BR><BR>在进一步阐述之前，我们需要明确几点：<BR><BR>A．无论synchronized关键字加在方法上还是对象上，它取得的锁都是对象，而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。<BR><BR>B．每个对象只有一个锁（lock）与之相关联。<BR><BR>C．实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。<BR><BR>接着来讨论synchronized用到不同地方对代码产生的影响：<BR><BR>&nbsp;<BR><BR>假设P1、P2是同一个类的不同对象，这个类中定义了以下几种情况的同步块或同步方法，P1、P2就都可以调用它们。<BR><BR>&nbsp;<BR><BR>1．&nbsp; 把synchronized当作函数修饰符时，示例代码如下：<BR><BR>Public synchronized void methodAAA()<BR><BR>{<BR><BR>//….<BR><BR>}<BR><BR>这也就是同步方法，那这时synchronized锁定的是哪个对象呢？它锁定的是调用这个同步方法对象。也就是说，当一个对象P1在不同的线程中执行这个同步方法时，它们之间会形成互斥，达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。<BR><BR>上边的示例代码等同于如下代码：<BR><BR>public void methodAAA()<BR><BR>{<BR><BR>synchronized (this)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; (1)<BR><BR>{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…..<BR><BR>}<BR><BR>}<BR><BR>&nbsp;(1)处的this指的是什么呢？它指的就是调用这个方法的对象，如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程，才可以调用P1的同步方法，而对P2而言，P1这个锁与它毫不相干，程序也可能在这种情形下摆脱同步机制的控制，造成数据混乱：（<BR><BR>2．同步块，示例代码如下：<BR><BR>public void method3(SomeObject so)<BR><BR>{<BR><BR>&nbsp;&nbsp;&nbsp; synchronized(so)<BR><BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…..<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>}<BR><BR>这时，锁就是so这个对象，谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时，就可以这样写程序，但当没有明确的对象作为锁，只是想让一段代码同步时，可以创建一个特殊的instance变量（它得是一个对象）来充当锁：<BR><BR>class Foo implements Runnable<BR><BR>{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private byte[] lock = new byte[0];&nbsp; // 特殊的instance变量<BR><BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Public void methodA()<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; synchronized(lock) { //… }<BR><BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //…..<BR><BR>}<BR><BR>注：零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码：生成零长度的byte[]对象只需3条操作码，而Object lock = new Object()则需要7行操作码。<BR><BR>3．将synchronized作用于static 函数，示例代码如下：<BR><BR>Class Foo<BR>{<BR><BR>&nbsp;&nbsp;&nbsp; public synchronized static void methodAAA()&nbsp;&nbsp; // 同步的static 函数<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //….<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; public void methodBBB()<BR>&nbsp;&nbsp;&nbsp; {<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(Foo.class)&nbsp;&nbsp; //&nbsp; class literal(类名称字面常量)<BR><BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR><BR>&nbsp;&nbsp; 代码中的methodBBB()方法是把class literal作为锁的情况，它和同步的static函数产生的效果是一样的，取得的锁很特别，是当前调用这个方法的对象所属的类（Class，而不再是由这个Class产生的某个具体对象了）。<BR><BR>记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样，不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。<BR><BR>可以推断：如果一个类中定义了一个synchronized的static函数A，也定义了一个synchronized 的instance函数B，那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时，不会构成同步，因为它们的锁都不一样。A方法的锁是Obj这个对象，而B的锁是Obj所属的那个Class。<BR><BR>&nbsp;<BR><BR>小结如下：<BR><BR>搞清楚synchronized锁定的是哪个对象，就能帮助我们设计更安全的多线程程序。<BR><BR>&nbsp;<BR><BR>还有一些技巧可以让我们对共享资源的同步访问更加安全：<BR><BR>1．&nbsp; 定义private 的instance变量+它的 get方法，而不要定义public/protected的instance变量。如果将变量定义为public，对象在外界可以绕过同步方法的控制而直接取得它，并改动它。这也是JavaBean的标准实现方式之一。<BR><BR>2．&nbsp; 如果instance变量是一个对象，如数组或ArrayList什么的，那上述方法仍然不安全，因为当外界对象通过get方法拿到这个instance对象的引用后，又将其指向另一个对象，那么这个private变量也就变了，岂不是很危险。 这个时候就需要将get方法也加上synchronized同步，并且，只返回这个private对象的clone()――这样，调用端得到的就是对象副本的引用了。]]></description>
<pubDate>
2007-09-07 10:44:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10309334.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10309334.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[没有密码不用急!190种超全的解密工具任你选!!值得珍藏!!]]></title>
<link>
http://plikefly.blogcn.com/diary,10266415.shtml</link>
<description>
<![CDATA[<H2>&nbsp;</H2>
<DIV class=entrytext>
<P>以下含扩了从系统密码到应用软件、最高深的BIOS到最常见的ZIP、RAR压缩文件几乎所有的密码解读、解密工具（共计190条），以方便大家使用。</P>
<P>唯有一点请朋友们切记：不要将这些超级解密工具用于非法的或有损他人利益的情况！！</P>
<P>------------------------------------------------------------------------------<BR>1、</P>
<P>1-2-3 Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/123kd.exe</P>
<P>　　可以帮助你恢复加了密码的Lotus1-2-3文件，支持Lotus1-2-3所有版本和多种语言密码。使用上相当简单，叁个部奏即可完成密码恢复。只需执行1-2-3Key，在将Lotus1-2-3文件(*.wk1、*.wk3、*.wk4、*.123)拖曳到1-2-3Key的视窗上即可将密码恢复，请勿将此程序用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>2、<BR>123 Write All Stored Passwords (Wsap) 2.01 </P>
<P>http://www.iopus.com/download/123wsap_setup.exe</P>
<P>　　可以将Windows操作系统密码清单(*.PWL)中的密码显示出来的软件.使用相当简单，执行后按下界面上的「AnalyzePasswordFileContent」即可将Windows操作系统密码清单(*.PWL)内的各项程序使用者名称和密码显示于界面上，这时你即可将这些使用者名称和密码记录下来，请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>3、<BR>ABF Password Recovery 1.4.0.231 </P>
<P>http://www.abf-soft.com/password ... RecoveryInstall.exe </P>
<P>　　邮件帐号解密工具，目前支持OutlookExpress及Outlook邮件工具，只要打开邮件工具，再打开ABFPasswordRecovery，就会将所有帐户(包含邮件、新闻群组..等)列出来，并将「****」星号部分的密码显示出来。...</P>
<P>--------------------------------------------------------------------------------<BR>4、<BR>Accent Access Password Recovery 2.02 </P>
<P>http://www.passwordrecoverytools.com..._202_setup.exe</P>
<P>　　MicrsoftAccess97/2000密码破解工具！该软件虽然非常小巧，但功能还算不错，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>5、<BR>Accent Excel Password Recovery 2.10 </P>
<P>http://www.passwordrecoverytools.com..._210_setup.exe</P>
<P>　　MicrsoftExel97/2000密码破解工具！该软件虽然非常小巧，但功能还算不错，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>6、<BR>Accent Money Password Recovery 2.00 beta 1 </P>
<P>http://www.passwordrecoverytools.com...00b1_setup.exe </P>
<P>　　MicrsoftMoney密码破解工具！该软件虽然非常小巧，但功能还算不错，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>7、<BR>Accent Office Password Recovery 2.11 </P>
<P>http://www.passwordrecoverytools.com..._211_setup.exe</P>
<P>　　MicrsoftOffice97/2000全系列密码破解工具！该软件虽然非常小巧，但功能还算不错，大家可以下载试一试...</P>
<P>--------------------------------------------------------------------------------<BR>8、<BR>Accent Word Password Recovery 2.10 </P>
<P>http://www.passwordrecoverytools.com..._210_setup.exe </P>
<P>　　MicrsoftWord97/2000密码破解工具！该软件虽然非常小巧，但功能还算不错，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>9、<BR>Access 2000 解密 2.1.1 </P>
<P>http://hlbr.onlinedown.net/down/access.zip</P>
<P>　　本软件是一个ACCESS2000加密文件密码恢复软件，本软件用优良的算法克服了很多同类软件在ACCESS文件被移动或复制和不能恢复密码的问题请您放心使用。...</P>
<P>--------------------------------------------------------------------------------<BR>10、<BR>Access Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/ak_demo.exe </P>
<P>　　是一个用来恢复MSAccess2/95/97/2000的数据库密码的软件，它能恢复所有由MSAccess2000支持的数据库文本的密码，并支持多语种密码设置，完全或部分安装。...</P>
<P>--------------------------------------------------------------------------------<BR>11、<BR>Access 密码查看器 1.0 </P>
<P>http://hnpy.onlinedown.net/down/Crackaccess.rar</P>
<P>　　MicrsoftAccess97/2000/XP/2003密码破解工具！该软件虽然非常小巧，但功能强大，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>12、<BR>ACCESS 密码克星 </P>
<P>http://www.qfanghe.com/crackaccess.rar </P>
<P>　　MicrsoftAccess97/2000/XP/2003密码破解工具！该软件虽然非常小巧，但功能强大，大家可以下载试一试。...</P>
<P>--------------------------------------------------------------------------------<BR>13、<BR>Access 密码破解终结 3.01 </P>
<P>http://vnet.onlinedown.net/down/AccessFinality.zip </P>
<P>　　含Access密码算法的VB源程序，支持双字节密码。适用于Access97/2000/xp/2003等全部版本。 ...</P>
<P>--------------------------------------------------------------------------------<BR>14、<BR>ACCESS2000密码查看器 4.0 </P>
<P>http://www.nyjj.net.cn/jwd/download/accesspwd.zip</P>
<P>　　用VB6编的一个ACCESS2000密码查看器。可以自动判断ACCESS97/2000、更易于使用，同时修改了界面，修正了多个错误。增加了查看ACCESS2000XP密码的功能....</P>
<P>--------------------------------------------------------------------------------<BR>15、<BR>ACCESS超级密探 2.0 </P>
<P>http://hlbr.onlinedown.net/down/ACCESSpassword.rar </P>
<P>　　本软件可以查看、更改ACCESS97/2000/XP数据库(MDB、MDE、MDA、MDW格式文件)的密码,查看位数均为20位。不受文件创建时间、复制的限制，均能正确查看文件密码。...</P>
<P>--------------------------------------------------------------------------------<BR>16、<BR>ACCESS密码查看器 2.1 </P>
<P>http://bbs.codeidea.com/qwh/accesspass.rar</P>
<P>　　当您忘记自己的ACCESS数据库密码时，可用此工具查看，支持ACCESS97/2000/XP，可查看20位的ACCESS2000密码，并且支持中文密码。...</P>
<P>--------------------------------------------------------------------------------<BR>17、<BR>Access密码终结 3.0 </P>
<P>http://hlbr.onlinedown.net/down/AccessFinality.rar</P>
<P>　　含Access密码算法的VB源程序，支持双字节密码。适用于Access97/2000/xp/2003等全部版本。...</P>
<P>--------------------------------------------------------------------------------<BR>18、<BR>Acrobat Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/acbtkeyd.exe </P>
<P>　　AcrobatKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对AdobeAcrobatPDF的文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>19、<BR>ACT Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/actkeyd.exe </P>
<P>　　ACTKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对Symantec制作的(.BLB)文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>20、<BR>Adult PDF Password Recovery Remover 2.1.0 </P>
<P>http://www.adultpdf.com/products/pwd...pwdremover.exe </P>
<P>　　PDF密码破解工具，针对那些设定用户密码，无法编辑或更改、打印、复制文字或图片，增加注释等等方面，它可以轻松的解除这些限制。 ...</P>
<P>--------------------------------------------------------------------------------<BR>21、<BR>Advanced Access Password Recovery 2.5 </P>
<P>http://www.newhua.com.cn/down/acpr.zip </P>
<P>　　帮你找出微软Access95/97数据库的密码.试用版只会显示所算出密码的前3位.注册版除了算出密码，还可以将密码改为你所指定的密码！...</P>
<P>--------------------------------------------------------------------------------<BR>22、<BR>Advanced ACT Password Recovery 1.21 汉化版 </P>
<P>http://xz.onlinedown.net/down/HA_ACT...-Scher1860.rar </P>
<P>　　一个恢复SymantecACT密码的工具。...</P>
<P>--------------------------------------------------------------------------------<BR>23、<BR>Advanced Archive Password Recovery 2.20 </P>
<P>http://www.crac*rd.com/dl/archpr.zip </P>
<P>　　AdvancedArchivePasswordRecovery可以解开ZIP/PKZip/WinZIP，ARJ/WinARJ，RAR/WinRAR(2.x)和ACE/WinACE(2.x)等几种压缩文件的密码！...</P>
<P>--------------------------------------------------------------------------------<BR>24、<BR>Advanced ARJ Password Recovery 2.0 </P>
<P>ftp://ftp.crac*rd.com/pub/elcom/AAPR/aapr.zip </P>
<P>　　忘记了ARJ压缩文件的密码怎么办？AAPR可以帮你将密码“猜”出来！它提供有预估算出密码所需要的时间；可中断计算与恢复继续前次的计算；在P-200/MMX一分钟可猜三千万组密码！...</P>
<P>--------------------------------------------------------------------------------<BR>25、<BR>Advanced Bac*rd Recovery 1.0 </P>
<P>http://202.99.172.24/down/abpr.zip </P>
<P>　　一个速度很快，可以帮你找回用Windows95/98备份工具制作的备份文件的密码，支持多密码，注册后可以解开多达128位密码。它提供有预估算出密码所需要的时间;可中断计算与恢复继续前次的计算。...</P>
<P>--------------------------------------------------------------------------------<BR>26、<BR>Advanced EFS Data Recovery 1.31 </P>
<P>http://download.elcomsoft.com/aefsdr.zip </P>
<P>　　AdvancedEFSDataRecovery是一个可以从WindowsNTFS分区里解密用EFS加密的文件的工具!...</P>
<P>--------------------------------------------------------------------------------<BR>27、<BR>Advanced Excel 2000 Password Recovery 1.11 </P>
<P>http://www.elcomsoft.com/AE2000PR/ae2000pr.zip </P>
<P>　　一个速度很快，帮你找出微软Excel97的密码破解工具，对中文版支持得很好！...</P>
<P>--------------------------------------------------------------------------------<BR>28、<BR>Advanced IM Password Recovery 2.10 </P>
<P>http://www.elcomsoft.com/AIMPR/aimpr.zip</P>
<P>　　即时通讯软件用户名和密码恢复工具，支持流行的ICQ,AOLIM,Yahoo!Messenger,M$NMessenger,ExciteMessenger,Odigo,Trillian,AT&amp;TIMAnywhere,T-OnlineMessenger,MatchMessenger,PraizeIM,ScreenFIRE,ACDE叉PressComunicator,ImiciMessenger,ProdigyIM,PowWowMessenger, JabberIM...</P>
<P>--------------------------------------------------------------------------------<BR>29、<BR>Advanced Instant Messengers Password Recovery 2.31 </P>
<P>http://www.crac*rd.com/dl/aimpr.zip </P>
<P>　　当你忘记或遗失你的实时通讯软件如ICQ，AOLInstantMessenger，Yahoo!Messenger，ExciteMessenger，MSNMessenger，Odigo，Trillian，AT&amp;TIMAnywhere，T-OnlineMessenger，MatchMessenger，PraizeIM，ScreenFIRE，ACDExpressComunicator，ImiciMessenger，ProdigyIM，PowWowMessenger，Jabbe...</P>
<P>--------------------------------------------------------------------------------<BR>30、<BR>Advanced Internet Explorer Password Recovery 1.24 </P>
<P>http://www.crac*rd.com/download/files/aiepr.zip </P>
<P>　　AdvancedInternetExplorerPasswordRecovery简称AIMPR，是一款专解聊天软件储存密码的密码破译工具，支持包括ICQ,AOLIM,Yahoo!Messenger,MSNMessenger,Odigo,TrillianandExciteMessenger!...</P>
<P>--------------------------------------------------------------------------------<BR>31、<BR>Advanced Intuit Password Recovery 1.24 </P>
<P>http://www.elcomsoft.com/AINPR/ainpr.zip </P>
<P>　　AdvancedIntuitPasswordRecovery是一款用来取回丢失或者是以往的密码的工具，支持多种密码格式!支持Quicken(*.QDI,*.QDB,*.QDF),QuickenLawyer(*.PFL)andQuickBooks(.QBA,.QBW)files.多种文件格式!...</P>
<P>--------------------------------------------------------------------------------<BR>32、<BR>Advanced Lotus Password Recovery 1.06 </P>
<P>http://www.elcomsoft.com/ALPR/alpr.zip </P>
<P>　　是Elcomsoft公司的密码恢复系列软件之一，它秉承了Elcomsoft产品的简单易用的特性，对IBM/Lotus产生的文档（Organizer,WordPro,1-2-3以及Approach)的密码可以极快的恢复，同时它也支持多语言的环境。...</P>
<P>--------------------------------------------------------------------------------<BR>33、<BR>Advanced Mailbox Password Recovery 1.6.5.190 </P>
<P>http://download.elcomsoft.com/ambpr.zip</P>
<P>　　可以帮助你重新找回丢失的邮箱的密码，支持FoxMail，MicrosoftInternetMailAndNews，Eudora，TheBat!，NetscapeNavigator/CommunicatorMail，Pegasusmail，Calypsomail，PhoenixMail，IncrediMail，@nyMail，Quic*，MailThem，Operamail，KaufmanMailWarrior，Becky!InternetMail等常用的...</P>
<P>--------------------------------------------------------------------------------<BR>34、<BR>Advanced Office Password Breaker 1.31 </P>
<P>http://www.elcomsoft.com/AOPB/aopb.zip<BR>　　AdvancedOfficePasswordBreaker是一个Office文档密码恢复软件，它能够将MicrosoftOffice文档的密码很快找回来，而且它还支持非英文字符。非注册版本只能找回小于四位的密码。...</P>
<P>--------------------------------------------------------------------------------<BR>35、<BR>Advanced Office XP Password Recovery std 2.42 </P>
<P>http://download.elcomsoft.com/aoxppr_s.zip </P>
<P>　　使用MicrosoftOffice的应用程序为文档加密，却把密码给忘记了吗？急得像热锅上的蚂蚁却没有人可以帮时，AdvancedOfficeXPPasswordRecovery或许可以助你一臂之力，如果你还记得“一点点”密码，它就能有效率的帮你“猜”出所忘记的密码喔！AdvancedOfficeXPPasswordRecovery是一个密码恢复软件，它能够将MicrosoftOffice97、Office2000以及OfficeXP文档的密码很快找回来，而且它还支持非...</P>
<P>--------------------------------------------------------------------------------<BR>36、<BR>Advanced Office XP Password Recovery pro 2.42 </P>
<P>http://download.elcomsoft.com/aoxppr_p.zip</P>
<P>　　使用MicrosoftOffice的应用程序为文档加密，却把密码给忘记了吗？急得像热锅上的蚂蚁却没有人可以帮时，AdvancedOfficeXPPasswordRecovery或许可以助你一臂之力，如果你还记得“一点点”密码，它就能有效率的帮你“猜”出所忘记的密码喔！AdvancedOfficeXPPasswordRecovery是一个密码恢复软件，它能够将MicrosoftOffice97、Office2000以及OfficeXP文档的密码很快找回来，而且它还支持非...</P>
<P>--------------------------------------------------------------------------------<BR>37、<BR>Advanced Office XP Password Recovery pro 2.40 汉化版 </P>
<P>http://nj.onlinedown.net/down/HB-AOXPPR24-fxj.ZIP</P>
<P>　　这是一个恢复由OfficeXP任何一个组件创建的文档的密码的工具。这些组件包括:Word、Excel、Access、PowerPoint、Visio、Publisher、Project、Outlook、Money、Backup、Schedule+、Mail和InternetExplorer。本软件也兼容非英语版本的MSOffice，操作方法详见“每日一帖”。...</P>
<P>--------------------------------------------------------------------------------<BR>38、<BR>Advanced Outlook Express Password Recovery 1.20 </P>
<P>http://www.elcomsoft.com/AOEPR/aoepr.zip </P>
<P>　　一个能帮你找出MicrosoftOutlookExpress(allversions)(*.pst)邮件的密码破解工具，,这个软件处理速度相当的快，也有支持中文的邮件...</P>
<P>--------------------------------------------------------------------------------<BR>39、<BR>Advanced Outloo*rd Recovery 1.32 </P>
<P>http://www.elcomsoft.com/AOLPR/aolpr.zip </P>
<P>　　是Outlook密码恢复软件，可以帮你恢复Outlook的加密文件。和其它的密码恢复软件不同的是「AOLPR」密码恢复的速度相当快。使用上相当简单，只需使用「AOLPR」开启加密文件即可「查寻」到正确的密码。支持微软Outlook所有版本和多重语言版本。另外，使用这类的「密码恢复」软件最好使用快一点的CPU且在WinNT或Win2k操作系统使用找到密码的速度会快一点。...</P>
<P>--------------------------------------------------------------------------------<BR>40、<BR>Advanced PDF Password Recovery 1.48 </P>
<P>http://download.elcomsoft.com/apdfpr.zip</P>
<P>　　是AdobeAcrobatPDF文件密码恢复软件，可以帮你恢复PDF的加密文件。密码恢复的速度相当快。使用上相当简单。...</P>
<P>--------------------------------------------------------------------------------<BR>41、<BR>Advanced PDF Password Recovery Pro 2.2.0 </P>
<P>http://www.elcomsoft.com/APDFPR/apdfprp.zip </P>
<P>　　那些加有密码的PDF文件无法进行编辑、打印、选择文字和图片（将其复制到剪贴板上）、增加/改变注释和表单部分。该软件的解密速度相当快，解密后的文件可以在任何的PDF查看器（比如：AdobeAcrobarReader）中打开，并且没有任何限制，这样你可以轻松地进行编辑、复制、打印操作。不过请注意APDFPR无法处理那些用户级密码的加密文档。 ...</P>
<P>--------------------------------------------------------------------------------<BR>42、<BR>Advanced PDF Password Recovery Pro 2.1 汉化版 </P>
<P>http://hlbr.onlinedown.net/down/HB-pdfpr21-fxj.ZIP </P>
<P>　　那些加有密码的PDF文件无法进行编辑、打印、选择文字和图片（将其复制到剪贴板上）、增加/改变注释和表单部分。该软件的解密速度相当快，解密后的文件可以在任何的PDF查看器（比如：AdobeAcrobarReader）中打开，并且没有任何限制，这样你可以轻松地进行编辑、复制、打印操作。不过请注意APDFPR无法处理那些用户级密码的加密文档。...</P>
<P>--------------------------------------------------------------------------------<BR>43、<BR>Advanced RAR Password Recovery 1.50 </P>
<P>http://www.elcomsoft.com/ARPR/arpr.zip </P>
<P>　　一个速度很快，可以帮你找回RAR文件的密码，注册后可以解开多达128位密码。它提供有预估算出密码所需要的时间；可中断计算与恢复继续前次的计算。...</P>
<P>--------------------------------------------------------------------------------<BR>44、<BR>Advanced VBA Password Recovery 1.50 </P>
<P>http://www.elcomsoft.com/AVPR/avpr.zip </P>
<P>　　AdvancedVBAPasswordRecovery是一个速度很快的密码恢复软件，它能够很轻松地将由VisualBasic编制的应用程序丢失的密码恢复过来，同样它也适用于Office97andOffice2000制作的文档。...</P>
<P>--------------------------------------------------------------------------------<BR>45、<BR>Advanced VBA Password Recovery Pro 1.50 </P>
<P>http://www.elcomsoft.com/AVPR/avprp.zip </P>
<P>　　AdvancedVBAPasswordRecovery是一个速度很快的密码恢复软件，它能够很轻松地将由VisualBasic编制的应用程序丢失的密码恢复过来，同样它也适用于Office97andOffice2000制作的文档。...</P>
<P>--------------------------------------------------------------------------------<BR>46、<BR>Advanced Windows Password Recovery 2.1.3.183 </P>
<P>http://www.elcomsoft.com/AWPR/awpr.zip </P>
<P>　　可以帮助你找回丢失或者遗忘的Windows密码，支持MicrosoftWindows95/98/2000/NT/XP，密码破译速度快，准确率高。...</P>
<P>--------------------------------------------------------------------------------<BR>47、<BR>Advanced Word 2000 Password Recovery 1.11 </P>
<P>http://www.elcomsoft.com/AW2000PR/aw2000pr.zip </P>
<P>　　一个速度很快，帮你找出微软Word97/2000的密码破解工具，对中文版支持得很好！...</P>
<P>--------------------------------------------------------------------------------<BR>48、<BR>Advanced Word97 Password Recovery 1.31 </P>
<P>http://www.elcomsoft.com/AW97PR/aw97pr.zip</P>
<P>　　一个速度很快，帮你找出微软Word97/2000的密码破解工具，对中文版支持得很好！...</P>
<P>--------------------------------------------------------------------------------<BR>49、<BR>Advanced WordPerfect Office Password Recovery 1.21 </P>
<P>http://download.elcomsoft.com/awopr.zip </P>
<P>　　帮你找回CorelWordPerfectOffice文档密码的工具!包括:WordPerfect(*.wp,*.wpd),QuattroPro(*.qpw,*.wb?,*.wq1),Paradox(*.db)!...</P>
<P>--------------------------------------------------------------------------------<BR>50、<BR>Advanced ZIP Password Recovery 3.54 </P>
<P>http://crac*rd.com/download/files/azpr.zip </P>
<P>　　AdvancedZIPPasswordRecovery能够很快的帮你找回你用Winzip或Pkzip生成的zip压缩文件的密码。它的操作很简单，还支持zip文件生成的各种不同的应用软件文件包。注册后可以解开多达128位密码。它提供有预估算出密码所需要的时间;可中断计算与恢复继续前次的计算。...</P>
<P>--------------------------------------------------------------------------------<BR>51、<BR>Advanced ZIP Password Recovery 3.53汉化版 </P>
<P>http://nj2.onlinedown.net/down/HAC-AZPR353-fy.exe </P>
<P>　　AdvancedZIPPasswordRecovery能够很快的帮你找回你用Winzip或Pkzip生成的zip压缩文件的密码。它的操作很简单，还支持zip文件生成的各种不同的应用软件文件包。注册后可以解开多达128位密码。它提供有预估算出密码所需要的时间;可中断计算与恢复继续前次的计算。...</P>
<P>--------------------------------------------------------------------------------<BR>52、<BR>Alive Internet Eraser 1.0.2.8 </P>
<P>http://www.alivecomputing.com/files/...rnetEraser.exe </P>
<P>　　是一个隐私保护程序。用来抹去你在计算机上活动的历史记录。它允许你抹去浏览器缓存，cookies，历史记录，访问过的URL链接，打出过的URL链接，自动完成数据和indexdat文件。AliveInternetEraser支持所有当前版本的IE浏览器以及Netscape,AOL,Opera和MSNExplorer。现在已经提供超过160种插件来快速清楚各种软件使用记录，如：MSOffice,WindowsMediaPlayer,WordPad,Paint,Acrobat...</P>
<P>--------------------------------------------------------------------------------<BR>53、<BR>AnyPassword 1.3 </P>
<P>http://www.romanlab.com/apw/apw.zip </P>
<P>　　本程序为多种密码获取的集合，可获取电脑内一般加密后的密码（如：屏幕保护、BIOS、共享、Access、查看*号密码、以及一些常用的如优化大师等密码）并提供删除密码功能（还有一些提供了修改密码的功能）。您拥有本程序，可方便快捷的找出你所忘记的密码。本程序不须要任何控件支持，程序短小，方便下载和存放。...</P>
<P>--------------------------------------------------------------------------------<BR>54、<BR>Asterisk Key 6.3.859 </P>
<P>http://www.lostpassword.com/f/downlo...y/ariskkey.exe </P>
<P>　　AsteriskKey是款密码恢复软件，在你忘记密码的时候他很有用的.包括自动显示ie浏览器里form中的*字符等，支持多语言密码。...</P>
<P>--------------------------------------------------------------------------------<BR>55、<BR>A型密码破解 0.2 </P>
<P>http://sap2.6to23.com/pggpjj1/up/pggpjjcrack2.rar </P>
<P>　　这是一款简单的破密码软件，破access密码和星号密码，操作简单。...</P>
<P>--------------------------------------------------------------------------------<BR>56、<BR>Backup Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/bckupkd.exe </P>
<P>　　BackupKey是一个恢复备份文件所设的密码的软件，它支持大多数备份软件备份的文件密码，如Nortonbackup、SymantecBackup、SeagateBackup等等。... </P>
<P>链链不舍<BR>查看公开信息<BR>发悄悄话给 链链不舍<BR>访问 链链不舍 的个人网站<BR>查找 链链不舍 发表的更多帖子<BR>添加 链链不舍 到好友列表 </P>
<P>昨天, 20:00 #2<BR>小叶<BR>转贴机器人</P>
<P>注册日期: 2005-09-04<BR>住址: 火星人<BR>帖子: 8,478<BR>精华: 21<BR>现金: 22 CH币<BR>资产: 10154 CH币<BR>声望力: 179<BR>声望: 118 </P>
<P>--------------------------------------------------------------------------------</P>
<P>不错。<BR>__________________</P>
<P>我本将心向明月，奈何明月照沟渠 ！</P>
<P>小叶<BR>查看公开信息<BR>发悄悄话给 小叶<BR>访问 小叶 的个人网站<BR>查找 小叶 发表的更多帖子<BR>添加 小叶 到好友列表 </P>
<P>昨天, 20:04 #3<BR>链链不舍<BR>新手上路</P>
<P>注册日期: 2006-01-14<BR>帖子: 7<BR>精华: 0<BR>现金: 14 CH币<BR>资产: 14 CH币<BR>声望力: 0<BR>声望: 10 </P>
<P>--------------------------------------------------------------------------------</P>
<P>--------------------------------------------------------------------------------<BR>57、<BR>BiosPwds 1.21 </P>
<P>http://hlbr.onlinedown.net/down/biospw12.zip</P>
<P>　　可以让你很轻松地得知Bios使用密码。使用上相当简单，执行后会有BiosPwds的介面，只需按下介面上的「GetPasswords」等个二、叁秒即会将Bios各项资讯显示于BiosPwds的介面上，包括：Bios版本、Bios日期、使用密码等，这时你便可以很轻松地得知Bios密码。...</P>
<P>--------------------------------------------------------------------------------<BR>58、<BR>CHKen 工具(看ACCESS密码,密码框,sap解密,取色) 1.0 </P>
<P>http://chken.jdz.info/downsoft/CHKenTools.exe</P>
<P>　　看ACCESS97-2003的密码,显示密码框中的密码(即显示****号),sap解密,取色!ause键开始和停止取色![Access密码查看器星号密码查看器取色器sap解密器集中与一身]...</P>
<P>--------------------------------------------------------------------------------<BR>59、<BR>CmosPwd 4.3 </P>
<P>http://www.cgsecurity.org/cmospwd-4.3.zip </P>
<P>　　CMOSBIOS密码恢复软件。适用于ACER/IBMBIOS、Award、Phoenix、Compaq(1992)、DELL、IBM、ZenithAMI、AMIBIOS、Toshiba等型号...</P>
<P>--------------------------------------------------------------------------------<BR>60、<BR>CoralSpy 0.8a </P>
<P>http://www.soff.net/download/CoralSpy.rar </P>
<P>　　由珊瑚虫　出品的CoralSpy是一款系统辅助工具。它集成多项实用功能于一身。如：抓取屏幕上任意像素的色值（这对于编程、网页制作和图形设计非常有用）；抓取*号显示的密码；抓取窗口中显示的目录树，并输出成.txt文本……它可以用来查看窗口或者控件的属性、复制平时无法复制的内容。同时，它也对IE提供了增强功能，对于系统中所有IE窗口都可以查看源代码，分析、下载页面中的链接、图片和Flash，还可以让页面高亮显示定义的字符串。CoralSpy还提供完善的自定义热键功能，...</P>
<P>--------------------------------------------------------------------------------<BR>61、<BR>CSPassword 7.1 </P>
<P>http://www.chrisseaton.com/downloads/cspassword.zip </P>
<P>　　可随手查阅您的密码文件，不再需要记忆密码。安装过程很简单，只要将解压缩文件的路径，指向您常用的文件夹里即可。3.0版以前是（PasswordSafe）...</P>
<P>--------------------------------------------------------------------------------<BR>62、<BR>CwGet 1.40 </P>
<P>http://www.dxsoft.com/download/cwget140.zip </P>
<P>　　CwGet是一个密码破译工具,它可以通过声卡，把摩斯电码（MorseCode）破译成文本!...</P>
<P>--------------------------------------------------------------------------------<BR>63、<BR>CwGet 1.39 beta </P>
<P>http://www.hamport.com/cwgetb.zip</P>
<P>　　CwGet是一个密码破译工具,它可以通过声卡，把摩斯电码（MorseCode）破译成文本!...</P>
<P>--------------------------------------------------------------------------------<BR>64、<BR>DecryptSQL 2000 2.1 </P>
<P>http://lottstar.nease.net/download/decryptsql.exe</P>
<P>　　DecryptSQL2000是一款针对SQLSERVER2000存储过程、视图、触发器、函数等的解密软件，使用方便简洁。软件为纯绿色软件，无需安装，直接执行即可。共享版本只能解密前1000个字符和少量功能限制。注册版则没有这个限制。...</P>
<P>--------------------------------------------------------------------------------<BR>65、<BR>Edwards WPS2000 Password Recovery 1.0 build 19990822 </P>
<P>http://hnpy.onlinedown.net/down/Edwa...rdRecovery.zip </P>
<P>　　它能帮您找回忘记了的WPS2000加密文件的密码！目前它提供了四种解密的方法：“后门方式”、“穷举方式”、“字典方式”和“模式匹配方式”。...</P>
<P>--------------------------------------------------------------------------------<BR>66、<BR>EFS Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/efskeyd.exe </P>
<P>　　磁盘格式加密文件恢复工具，界面像资源管理器。...</P>
<P>--------------------------------------------------------------------------------<BR>67、<BR>Entry LE 2.71 </P>
<P>http://www.spar*m/prog/entryle.exe</P>
<P>　　EntryLE可以帮你找到ftp密码、网站密码、pop3信箱密码。原来就是为初学者所设计，所以他非常容易使用。可以一次攻击多部电脑，在crack电脑后会自动产生log，只要设定一个密码就可自动打开在你网站上的安全网页、自动跳过讨人厌的使用者名称以及密码。还有令人意想不到的许许多多功能。...</P>
<P>--------------------------------------------------------------------------------<BR>68、<BR>Excel Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/xlkeyd.exe </P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复Excel文件的密码。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>69、<BR>EXCEL97/2000/XP密码查看器 3.0 </P>
<P>http://www.nyjj.net.cn/jwd/download/excelpwd.zip</P>
<P>　　本程序只用于个人excel文档密码遗忘时，试图探测密码；减少重复劳动，不可进行其它不当使用，否则后果由使用者自负。...</P>
<P>--------------------------------------------------------------------------------<BR>70、<BR>FileMaker Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/fmkeyd.exe</P>
<P>　　FileMakerKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对FileMaker的.FP3文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>71、<BR>Get Access97&amp;2000 Password 1.0 </P>
<P>http://www.qwerks.com/download/3846/...ssPassword.zip </P>
<P>　　MicrosoftOffice家族的应用软件系列几乎都具备了对数据文件的保护功能。透过对数据文件设定密码，你就可以避免他人任意读取或修改你所建立的数据。但如果档案过多，连自己都忘了密码该怎么办呢？这时就让GetAccess97&amp;2000Password来为你脱困吧！...</P>
<P>--------------------------------------------------------------------------------<BR>72、<BR>Get ISP Info 2.0 </P>
<P>http://www.newhua.com.cn/down/getisp.exe</P>
<P>　　你可能会忘记你的拨号网络密码了，你想换个密码，怎么办？也许要通知你的ISP把密码改回原始密码再重新输入密码吧，现在不需要了，只要你曾经在拨号时使用了“记住密码”选项，此软件就可以把密码用户名列出。...</P>
<P>--------------------------------------------------------------------------------<BR>73、<BR>Get Password 0.03a </P>
<P>http://www.newhua.com.cn/down/GETPWD03.EXE </P>
<P>　　查看密码窗*****中被隐藏住的密码。取密码有两种方式，可以在主窗口中选择。第一种是在密码框上面绘出密码，当窗口被重画之后（比如切换到了别的程序，或者窗口移动到了屏幕外面），密码框会恢复原来的样子；第二种是干脆把一堆星号换成真正的密码，当窗口关闭后再次打开，密码框也会恢复原状。支持Win95/Win98/WinNT4SP3&amp;SP4/2000,详细说明请看压缩包中的Readme.TXT。...</P>
<P>--------------------------------------------------------------------------------<BR>74、<BR>GetPassword 1.0 </P>
<P>http://hnpy.onlinedown.net/down/GetPassword.zip </P>
<P>　　查看*后面的密码。注意：使用时请在窗体客户区的任意位置按下鼠标左键，但不要在放大镜图标上按，这时鼠标光标将变成放大镜，按住不放，将它拖动到要查看的密码编辑框上，则Password编辑框中将显示密码。...</P>
<P>--------------------------------------------------------------------------------<BR>75、<BR>HF星号探测器 1.0 </P>
<P>http://nj2.onlinedown.net/down/hfpasswd.rar</P>
<P>　　本软件可以显示星号密码部分,网页密码暂时无法显示. 有什么问题可以到黑色反击提问. http://www.hf110.com...</P>
<P>--------------------------------------------------------------------------------<BR>76、<BR>IMAIL密码查看软件 1.0 </P>
<P>http://www.chinacaller.com/down/regimail.zip </P>
<P>　　IMAIL这是一个高性能的，基于标准的SMTP/POP3/IMAP4/LDAP邮件服务器。通过一个简单直观的图形用户界面，非常易于管理。主要特色包括：多域名支持，远程管理，Web邮件，可创建邮递清单（mailinglists），反垃圾邮件支持，等等。。。。。）很牛B吧！由于管理方面的原因，IMAIL不能显示设置的密码，如果忘记只能重设，不能找回密码，此软件可以从注册表中取出加密的密码并解密，能显示所有域的所有用户的密码。win2000，IMAIL7.04测试通过。参考...</P>
<P>--------------------------------------------------------------------------------<BR>77、<BR>Intelore Access Password Recovery 1.0e </P>
<P>http://www.intelore.com/access/acces...d-recovery.exe </P>
<P>　　可以帮助你快速的找回丢失或者遗忘的Excel文档的密码,支持AccessXP/2002/2000/97等各个版本,不管数据库的密码有多长程序都可以帮助你立即找回原来丢失的密码,另外此程序支持多种语言的密码形式!...</P>
<P>--------------------------------------------------------------------------------<BR>78、<BR>Intelore Excel Password Recovery 1.0e </P>
<P>http://www.intelore.com/excel/excel-...d-recovery.exe</P>
<P>　　InteloreExcelPasswordRecovery可以帮助你快速的找回丢失或者遗忘的Excel文档的密码,支持Excel2003/XP/2002/2000/97等各个版本,程序支持包括"brute-force"破译技术,基于字典的破译技术和非常快速的"Booost-Up"破译技术三种破译方式,并具有类似于断点续传的功能,可以在你中断了破译之后,自动记忆并可以在下次继续从上次中断的地方继续破译过程,非常实用,推荐下载!...</P>
<P>--------------------------------------------------------------------------------<BR>79、<BR>Intelore Word Password Recovery 1.0f </P>
<P>http://www.intelore.com/winword/word...d-recovery.exe</P>
<P>　　InteloreWordPasswordRecovery可以帮助你快速的找回丢失或者遗忘的Excel文档的密码,支持WordXP/2002/2000/97等各个版本,程序支持包括"brute-force"破译技术,基于字典的破译技术和非常快速的"Booost-Up"破译技术三种破译方式,并具有类似于断点续传的功能,可以在你中断了破译之后,自动记忆并可以在下次继续从上次中断的地方继续破译过程,非常实用,推荐下载!...</P>
<P>--------------------------------------------------------------------------------<BR>80、<BR>Internet Explorer Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/iekeyd.exe</P>
<P>　　InternetExplorerKey是一个密码恢复软件，它能够使IE所设的密码立即重新设立。它支持IE5.0和IE4.0,同时还支持多语言设置密码，完全和部分安装。...</P>
<P>--------------------------------------------------------------------------------<BR>81、<BR>Internet Explorer Password Revealer 1.3 </P>
<P>http://www.rixler.com/download/iepasrev.zip</P>
<P>　　InternetExplorerPasswordRevealer便是一个可以帮你找回你所登入的密码及账号的网站数据软件，使用上相当简单，只要安装及执行该软件即可，如此所有浏览过的网站及网页的登入密码及账号便一览无遗了。该软件只适用于InternetExplorer4.0以上的浏览器所浏览过的网站。...</P>
<P>--------------------------------------------------------------------------------<BR>82、<BR>iOpus Password Recovery XP 4.02 </P>
<P>http://www.iopus.com/download/iopus-pwdrec-setup.exe</P>
<P>　　是一种密码恢复软件，它可以帮助你阅读任何隐藏于*号的密码。使用上相当简单，不需要任何等待时间。只需将PasswordRecovery的侦探图示拖曳到*号密码上即会将隐藏于*号的密码显示于界面上。...</P>
<P>--------------------------------------------------------------------------------<BR>83、<BR>Mail Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/mailkd.exe </P>
<P>　　MailKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对MSMail的.MMF文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>84、<BR>Mitdeco 3.0 </P>
<P>http://ks.onlinedown.net/down/mitdc30.zip </P>
<P>　　MITSUBISHI-A系列PLC密码恢复软件!软件操作简单,使用方便,欢迎大家下载试用!...</P>
<P>--------------------------------------------------------------------------------<BR>85、<BR>Money Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/mk_demo.exe </P>
<P>　　是Passware公司制作的系列密码恢复软件之一，它可以对微软的Moneyfiles进行快速恢复。它还支持多语言密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>86、<BR>MSPassword(For MSAccess) 1.0 </P>
<P>http://ks.onlinedown.net/down/MSPassword.exe</P>
<P>　　本软件为测试版本,只解密3位密码,请EMAIL作者免费索取正式版本。 MSACCESS数据库密码查询器，可以重新查找到遗忘的MSACCESS数据库密码。 (适用MSACCESS97/2000/XP) 使用环境：win95/win97/win98/winme/win2000/winxp/winnt 安装：不需要，直接运行即可开发作者：王少华...</P>
<P>--------------------------------------------------------------------------------<BR>87、<BR>MYOB Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/myobkeyd.exe </P>
<P>　　是由Passware公司制作的系列密码恢复类软件之一，它可以对MYOB数据文件(.PLS）进行密码快速恢复。同时它还支持多语言密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>88、<BR>Network and Dial-up Password Revealer 1.2 </P>
<P>http://www.rixler.com/download/npasrev.zip</P>
<P>　　可查出你网络联机登入时的账号及密码，忘了你拨号联机的账号及密码了吗，就让NetworkandDial-upPasswordRevealer来告诉你吧。...</P>
<P>--------------------------------------------------------------------------------<BR>89、<BR>Network Neighborhood Password Cracker 3.0 </P>
<P>http://nj2.onlinedown.net/down/nn_brute.zip </P>
<P>　　是以自定最小与最大密码长度、字母、符号组合成字串查询密码的方式试着找到正确的密码。使用图形操作界面，也提供随时中断密码查询及储存功能，下次要恢复前次的查询时，只需将储存的文件读入即可继续上次的查询，请勿用于不法用途。...</P>
<P>--------------------------------------------------------------------------------<BR>90、<BR>Office Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/offkeyd.exe </P>
<P>　　OfficeKey是由Passware制作的系列密码恢复软件之一，它可以迅速恢复Office文件(Access、Excel、Outlook、Word、VisualBasic)的密码。同时它还支持多语言密码设定。内有的文件密码回复功能。...</P>
<P>--------------------------------------------------------------------------------<BR>91、<BR>Office Password Recovery Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/offkeyd.exe</P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复Office文件(Access、Excel、Outlook、Word、VisualBasic)的密码。同时它还支持多语言密码设定。内有的文件密码回复功能。...</P>
<P>--------------------------------------------------------------------------------<BR>92、<BR>Organizer Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/orgkeyd.exe</P>
<P>　　这个程序可以帮助你恢复加了密码的LotusOrganizer文件，支持LotusOrganizer所有版本和多种语言密码。使用上相当简单，叁个部奏即可完成密码恢复。只需执行OrganizerKey，在将LotusOrganizer文件(*.OR？)拖曳到LotusOrganizer的视窗上即可将密码恢复，请勿将此程序用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>93、<BR>Outlook Express Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/oekeyd.exe </P>
<P>　　OutlookExpressKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对OutlookExpress的文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>94、<BR>Outlook Express Password Revealer 1.1 </P>
<P>http://www.rixler.com/download/oepasrev.zip </P>
<P>　　常常忘记邮件收取及发送时所登入的密码及帐号，该如何是好呢？ OutlookExpressPasswordRevealer便是一个可以帮你查出你所登入的邮件的帐号及密码工具软件，使用上相当简单，只要安装及执行该软件即可，如此所有邮件的登入密码及帐号便一览无遗了。该软件只适用于OutlookExpress的邮件软件。 ...</P>
<P>--------------------------------------------------------------------------------<BR>95、<BR>Outlook Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/ok_demo.exe </P>
<P>　　OutlookKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对Outlook的文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>96、<BR>Paradox Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/pdoxkeyd.exe</P>
<P>　　是由Passware公司制作的系列密码恢复软件之一，它可以迅速将Paradox数据库文件的密码恢复过来。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>97、<BR>Passware Kit 6.3 </P>
<P>http://www.lostpassword.com/demos/kitd.exe</P>
<P>　　“PasswareKitEnterprise可以找回各种世界上最受欢迎的办公室应用程序档案失去或忘记密码，包括Excel、Word、Windows2003/XP/2K/NT、LotusNotes、RAR、WinZip、Access、Outloo*bat、Quicken、QuickBooks、WordPerfect以及VBA。支持包括Office2003等所有的MSOffice软件。PasswareKit可以为开启档案、填写意见、练习本、工作窗体、样板文件、...</P>
<P>--------------------------------------------------------------------------------<BR>98、<BR>Password Recovery Toolbox 1.1.0.3 </P>
<P>http://www.rixler.com/cgi-bin/downlo...ile=prtbox.zip</P>
<P>　　PasswordRecoveryToolbox是一个提取、清除、管理IE、OutlookExpress和Windows的登陆和密码的软件。软件也可以对特定站点消除登陆信息。...</P>
<P>--------------------------------------------------------------------------------<BR>99、<BR>Password Recovery Toolkit 4.3r </P>
<P>http://nj.onlinedown.net/down/prtkdemo32.zip </P>
<P>　　密码恢复工具套装，能恢复以下软件所加的密码：Access、Approach、dBase、Excel、Netware、OutlookExpress、WindowsNTServerandWor*n、WinZip、Word、WordPerfect和WordPro等。...</P>
<P>--------------------------------------------------------------------------------<BR>100、<BR>Password Reminder 1.5 </P>
<P>http://www.newpowersoft.com/password...nder/setup.exe</P>
<P>　　******,你的密码变成了这种形式，而你又忘记了该怎么办。这时你可以把passwordrreminder中的放大镜拖放到星号上，便可以恢复你遗忘的密码了。 ...</P>
<P>--------------------------------------------------------------------------------<BR>101、<BR>Password Spectator Lite 1.3 </P>
<P>http://www.refog.com/files/passpectlite130.exe</P>
<P>　　PasswordSpectator来为你显示目前已经设定好的帐号密码相当简单，只要几个简短的步骤便可达成，首先启动显示「****」的帐号密码设定画面，接着请打开PasswordSpectator，接着请按住[Ctrl]键然后按用鼠标左键在密码栏位中按下，原本「****」的密码内容以英数字组合的原始设定密码出现，不过记得要将显示出来的密码加以还原，将先前压下的[Ctrl]键改以[Shift]替代即可。相较于其它密码复原软件，PasswordSpectator最特别的就是...</P>
<P>--------------------------------------------------------------------------------<BR>102、<BR>Password Spectator pro 3.05 </P>
<P>http://www.refog.com/files/passpectpro.exe</P>
<P>　　PasswordSpectator来为你显示目前已经设定好的帐号密码相当简单，只要几个简短的步骤便可达成，首先启动显示「****」的帐号密码设定画面，接着请打开PasswordSpectator，接着请按住[Ctrl]键然后按用鼠标左键在密码栏位中按下，原本「****」的密码内容以英数字组合的原始设定密码出现，不过记得要将显示出来的密码加以还原，将先前压下的[Ctrl]键改以[Shift]替代即可。相较于其它密码复原软件，PasswordSpectator最特别的就是...</P>
<P>--------------------------------------------------------------------------------<BR>103、<BR>Password Spyer 2k 2.4 </P>
<P>http://www.maros-tools.com/downloads/spyer2k.zip </P>
<P>　　这是一款能帮助你找回已遗失的密码的软件。例如：outlook,cuteftp,ws_ftp,ICQ等等...的登录密码。... </P>
<P>链链不舍<BR>查看公开信息<BR>发悄悄话给 链链不舍<BR>访问 链链不舍 的个人网站<BR>查找 链链不舍 发表的更多帖子<BR>添加 链链不舍 到好友列表 </P>
<P>昨天, 20:05 #4<BR>链链不舍<BR>新手上路</P>
<P>注册日期: 2006-01-14<BR>帖子: 7<BR>精华: 0<BR>现金: 14 CH币<BR>资产: 14 CH币<BR>声望力: 0<BR>声望: 10 </P>
<P>--------------------------------------------------------------------------------</P>
<P>--------------------------------------------------------------------------------<BR>104、<BR>Password Unmask 1.6 </P>
<P>http://www.alpinesnow.com/PWUnmask_demo.exe </P>
<P>　　是一个可以将*号密码显示出来的软件。能够帮助电脑使用者解出ISP、电子邮件、FTP等*号密码背后的真正信息，也就是能够让你得知真正的密码。使用上相当简单，不需要任何的等待时间，只要执行它，在利用鼠标将*号密码标示起来即可将*号密码显示出来，且可以按鼠标右键将密码复制下来。「PasswordUnmask」虽是共享软件，不过，无密码长度限制，可以将*号密码完全显示出来，请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>105、<BR>PasswordViewer 2.43 Beta </P>
<P>http://evenmorn.html./downloads/pwv_243prsetup.rar </P>
<P>　　可以恢复的密码包括：屏保密码、Access数据库密码、CMOS密码、Win9x共享文件夹密码、Win9x缓存密码、各种Internet账号密码、ProtectedStroageSystem中储存的密码、一些常用应用程序的密码、网页中的密码框的密码、FoxMail账号与密码等等。还超值奉送了支持Win2000/XP的星号探测器、ProtectedStorageSystem浏览器、密码搜索工具等高级功能！ ...</P>
<P>--------------------------------------------------------------------------------<BR>106、<BR>PDF Password Recovery Pro 2.12 </P>
<P>http://crac*rd.com/download/files/apdfprp.zip </P>
<P>　　是AdobeAcrobatPDF文件密码恢复软件，可以帮你恢复PDF的加密文件。密码恢复的速度相当快。使用上相当简单。...</P>
<P>--------------------------------------------------------------------------------<BR>107、<BR>PDF Password Remover 2.10 </P>
<P>http://www.toppdf.com/pwdremover/pwdremover.exe </P>
<P>　　是一款可以帮助你解除PDF文件密码的工具。...</P>
<P>--------------------------------------------------------------------------------<BR>108、<BR>Peachtree Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/peachkeyd.exe </P>
<P>　　PeachtreeKey是由Passware制作的系列密码恢复软件之一，它可以迅速恢复PeachtreeCompleteAccountingcompany文件的密码。同时还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>109、<BR>PLC密码查看工具 3.0 </P>
<P>http://crc.onlinedown.net/down/deco30.zip </P>
<P>　　可以查看三菱FX系列和富士系列PLC密码!软件操作简单,使用方便,只需联接PLC编程电缆,点击按钮即可显示PLC密码!为您解除忘记密码的烦恼!...</P>
<P>--------------------------------------------------------------------------------<BR>110、<BR>PM Lost Password Retrieval 1.0 </P>
<P>http://nj2.onlinedown.net/down/pmlpr.exe </P>
<P>　　是一个可以将Windows操作系统「密码清单(*.PWL)」中所储存的密码显示出来的免费软件。使用上相当简单，不需要任何的等待时间，只要执行它，在按下界面上的「RetrievePasswords」按钮，即可将密码清单(*.PWL)中所储存的密码显示于界面上，请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>111、<BR>PN ZIP Recovery 1.0 </P>
<P>http://www.panakes.com/setup.exe</P>
<P>　　PNZIPRecovery是灵钥（中国）科技有限公司出品的ZIP文档密码恢复产品（无需注册），它的破解速度可达每秒百万以上，破解率可达90%以上，支持高达15个字符的长度的密码及三种智能化恢复方式。本产品专为中国用户设计，软件提供了完全中文化的界面，简易快捷的操作方式及详细的中文操作文档。灵钥（中国）科技公司还为用户提供了有偿的破解服务，帮助用户找回无法破解的密码，更多信息请访问公司网站www.panakes.com ...</P>
<P>--------------------------------------------------------------------------------<BR>112、<BR>Project Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/projkeyd.exe </P>
<P>　　是由ProjectKey制作的系列密码恢复软件之一，它可以迅速恢复MicrosoftProject文件的密码。同时还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>113、<BR>Protected Storage PassView 1.60 汉化版 </P>
<P>http://as.onlinedown.net/down/ha_pspv160_lmx.rar </P>
<P>　　这是一个查看密码的软件，可以自动搜索IE的自动完成密码、OE密码、Outlook密码和MSNExplorer密码，以便自己查看、删除等管理，这一版本加入了对表单记录的管理。如在登录某个网站，输入帐号密码时，若选择了让IE自动完成，那么下次再登陆该站点时就不会出现“****”的密码掩盖符号了，用一般查看“****”的软件也无能为力。虽可自动登陆，但若忘记了密码，到要修改密码或是到别的电脑上就不能登录了。这时可以使用ProtectedStoragePassView就可以把...</P>
<P>--------------------------------------------------------------------------------<BR>114、<BR>Protected Storage PassView 1.6 </P>
<P>http://freehost14.websamba.com/nirsoft/utils/pspv.zip </P>
<P>　　这是一个查看密码的软件，可以自动搜索IE的自动完成密码、OE密码、Outlook密码和MSNExplorer密码，以便自己查看、删除等管理，这一版本加入了对表单记录的管理。如在登录某个网站，输入帐号密码时，若选择了让IE自动完成，那么下次再登陆该站点时就不会出现“****”的密码掩盖符号了，用一般查看“****”的软件也无能为力。虽可自动登陆，但若忘记了密码，到要修改密码或是到别的电脑上就不能登录了。这时可以使用ProtectedStoragePassView就可以把...</P>
<P>--------------------------------------------------------------------------------<BR>115、<BR>PW CACHE 1.0 </P>
<P>http://nj.onlinedown.net/down/pwche10.zip</P>
<P>　　可以帮你重新取回Windows所储存的密码，看到使用者名称及密码，还可以打印出来。...</P>
<P>--------------------------------------------------------------------------------<BR>116、<BR>Pw Check 2.0 Pro </P>
<P>http://nj2.onlinedown.net/down/PWCheck2.0Pro.zip</P>
<P>　　是一个可以用来破解软件注册码、文件密码和其它种种密码的工具软件。2.00Pro版比起以前的版本有了很大的改进，核心代码完全重写速度更快在PIII450中测试平均每分钟可以输入7000-8000次，而在AMD的雷鸟800上测试的速度更可达到每分钟31000次。证明软件的运行速度只与CPU和系统有关，CPU的速度越快输入的速度越快。在此版本中还新增了字典组合器(包括数字组合器和自定义组合器)。数字组合器可以组合出从1-1000000000中的任何一个数，而自定义组合器功能...</P>
<P>--------------------------------------------------------------------------------<BR>117、<BR>PW_Access 1.01 </P>
<P>http://nj2.onlinedown.net/down/PW_Access.zip</P>
<P>　　一个实用的小工具，该软件可恢复ACCESS97/2000数据库的密码。...</P>
<P>--------------------------------------------------------------------------------<BR>118、<BR>PwdViewer 1.02 </P>
<P>http://sq.onlinedown.net/down/PwdViewer1.02.rar</P>
<P>　　又一款查看星号密码的工具,体积只有6.5K,支持查看对话框和网页中的星号密码,纯绿色软件无需安装. 使用方法:运行后点确定,将鼠标移动到要查看的密码框上,密码将显示在鼠标下面的黄颜色的小方框内.用Ctrl+C复制的到的密码到剪贴板,ESC键退出...</P>
<P>--------------------------------------------------------------------------------<BR>119、<BR>Quattro Pro Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/qpkeyd.exe</P>
<P>　　QuattroProKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对QuattroPro的文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>120、<BR>QuickBooks Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/qbkeyd.exe</P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复QuickBooks文件（.QBWand.QBA）的密码。同时它还支持多语言密码设定。...</P>
<P>---------------------------------------------------------------------------------- </P>
<P>121、　 </P>
<P>Quicken Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/quickeyd.exe </P>
<P>　　由「Intuit」公司所推出的「Quicken」是一套在国外相当受欢迎的个人财务管理软件，QuickenKey可以帮你恢复Quicken的加密文件。和其它的密码恢复软件一样，是以自定最小与最大密码长度、数字、字母、符号组合成字串的方式来「查寻」试着找到正确的密码。使用上只需将Quicken的加密文件(.QDF)拖曳到QuickenKey的视窗上即可「查寻」试着找到正确的密码，支持Quicken99和Quicken2000以及多重语言密码。另外，使用这类「密码恢复」软件...</P>
<P>--------------------------------------------------------------------------------<BR>122、<BR>Quic*rd Generator 1.2 </P>
<P>http://www.quickysoftware.com/ftp/pubfiles/qpassgen.zip</P>
<P>　　是一个小巧但是有实效的密码工具软件，他可以根据实际情况生成5000个左右的4至20位的密码。它可以将生成的密码显示或拷贝在剪贴板上，你还可以设置它们为文字、数字、或大写等形式。...</P>
<P>--------------------------------------------------------------------------------<BR>123、<BR>RAR Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/rarkeyd.exe </P>
<P>　　RARKey是由lostpassword制作的系列密码恢复软件之一，它主要是用于对RAR的.RAR文件进行恢复。它可以迅速恢复密码，同时还支持各语种的密码，以及反安装。...</P>
<P>--------------------------------------------------------------------------------<BR>124、<BR>RAR Password Cracker 4.10 汉化补丁 </P>
<P>http://hnpy.onlinedown.net/down/HB-RARpc410-NW.zip </P>
<P>　　RARPasswordCracker一个专门用来破解RAR压缩文件密码的程序，通过穷举、密码字典等方法，它可以快速破解被密码保护的文件。新版本具备了状态存储、并行计算、多卷文件支持等新功能。...</P>
<P>--------------------------------------------------------------------------------<BR>125、<BR>RAR Password Cracker 4.12 </P>
<P>http://dnsoft.swrus.com/rpc/rpc412_setup.exe </P>
<P>　　RARPasswordCracker一个专门用来破解RAR压缩文件密码的程序，通过穷举、密码字典等方法，它可以快速破解被密码保护的文件。新版本具备了状态存储、并行计算、多卷文件支持等新功能。...</P>
<P>--------------------------------------------------------------------------------<BR>126、<BR>RAR Password Recovery 1.1 RC6 </P>
<P>http://www.intelore.com/winrar/rar-p...d-recovery.exe</P>
<P>　　RARPasswordRecovery是一个可以帮助你快速的找回丢失或者忘记的RAR/WinRAR压缩包的解压缩密码的密码破译工具,程序支持暴力破解,基于字典的破解和非常独特的"Booost-Up"破解方式,并可以随时恢复上次意外中止的密码破解工作!类似于断点续传功能,非常实用!...</P>
<P>--------------------------------------------------------------------------------<BR>127、<BR>Revelation 2.0.1.100 </P>
<P>http://www.snadboy.com/RevelationV2.zip </P>
<P>　　查看Windowns中的xxxxxxx的真实字符软件，如果你自己忘了一些密码，用这个程序就可以让你从新知道原来的密码!小巧强大的密码揭示工具。只需用鼠标左键拖动十字框到密码处，即可将密码显示出来，而且你还可以将密码复制到剪贴板上。对Bec*luteFTP用Caption_it无法查看的密码它都可以办到。...</P>
<P>--------------------------------------------------------------------------------<BR>128、<BR>Schedule Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/sc_demo.exe </P>
<P>　　是由Passware公司制作的密码恢复系列软件之一，它可以迅速恢复MSSchedule+7.x(.SCD)和1.x(.CAL)文件的密码。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>128、<BR>Schedule Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/sc_demo.exe </P>
<P>　　是由Passware公司制作的密码恢复系列软件之一，它可以迅速恢复MSSchedule+7.x(.SCD)和1.x(.CAL)文件的密码。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>129、<BR>Screen Saver Password Recovery 1.0 </P>
<P>http://www.alpinesnow.com/sspwrecovery_demo.exe</P>
<P>　　密码恢复软件，适合以忘记屏幕保护程序使用密码的使用者使用。可以立即恢复屏幕保护程序使用密码，请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>130、<BR>See Password 0.8 </P>
<P>http://vnet2.onlinedown.net/down/18kSee.rar </P>
<P>　　将Windows下密码框中的'***'显现原形，鼠标即指即译,操作简单。程序完全用API写成，体积小，占用资源少。...</P>
<P>--------------------------------------------------------------------------------<BR>131、<BR>Serials 2000 Update 升级包 [2004.01.01] </P>
<P>http://hnpy.onlinedown.net/down/ ... date.2004.01.01.rar</P>
<P>　　Serials2000是世界著名的破解组织Egis/Core出品的最好的注册码/序列号查询软件，内含几万个最新软件的注册码。新版重新编写了界面，查询使用更加方便，而且已经成为一个注册码管理器，用户可以把自己收集的注册码作为数据库存入Serials2000中，查找方便快速。Egis/Core会定期在网上公布最新的注册码数据文件(.seu)，用户只要下载后更新自己的数据库就行了，一般每个月两次。新版数据库已经更新到2003年11月05日。 ...</P>
<P>--------------------------------------------------------------------------------<BR>132、<BR>Serials 2000 Total Update 累计升级包 [2004.01.01] </P>
<P>http://hnpy.onlinedown.net/down/ ... date.2004.01.01.rar </P>
<P>　　Serials2000是世界著名的破解组织Egis/Core出品的最好的注册码/序列号查询软件，内含几万个最新软件的注册码。新版重新编写了界面，查询使用更加方便，而且已经成为一个注册码管理器，用户可以把自己收集的注册码作为数据库存入Serials2000中，查找方便快速。Egis/Core会定期在网上公布最新的注册码数据文件(.seu)，用户只要下载后更新自己的数据库就行了，一般每个月两次。新版数据库已经更新到2003年11月05日。...</P>
<P>--------------------------------------------------------------------------------<BR>133、<BR>Serials 2000 8.1 正式双语版 </P>
<P>http://www.hu.zj.cninfo.net/~stock5/...00V81EN-CN.rar </P>
<P>　　Serials2000是最好的注册码/序列号查询软件。用户可以把自己手头的注册码作为数据库存入Serials2000中，查找方便快速。作者定期在网上公布最新的注册码数据文件(.seu)，用户只要下载后更新自己的数据库就行了，一般每个月两次。此汉化包是最新的Serials20008.0的汉化版，无需原版。汉化版的序列号数据库已更新到2003.8.5！...</P>
<P>--------------------------------------------------------------------------------<BR>134、<BR>Show Screen Saver Password 1.0 </P>
<P>http://nj2.onlinedown.net/down/SSSP.EXE </P>
<P>　　可以把您或某一台电脑上头的屏幕保护程序所设定的密码显示出来。这个软件非常小只有4K的大小，相当方便携带，而作者特别强调，这个软件并不是用来做偷窥他人电脑资讯的用途。但这个软件实在相当方便的就可以在某台已经开机的电脑上执行，所以如果您电脑上有设定屏幕保护程序，并且设定了密码的话，也请特别留意，不要让他人有机可趁的偷看您的密码喔。...</P>
<P>--------------------------------------------------------------------------------<BR>135、<BR>small 密码查看器 1.8 </P>
<P>http://www.yes4f.com/xie/xpass.exe </P>
<P>　　这可能是世界上最小巧的星号密码查看器了，自身程序大小还不到5K。如果再用Winrar进行压缩打包的话，只有3K了，经典吧。功能：查看Windows中以“＊＊＊”显示的密码窗口中的实际内容，支持Windows95/98/ME/NT/2000/XP/2003各种操作系统。方法：打开程序后，移动鼠标到显示【***】的密码窗口上即可。...</P>
<P>--------------------------------------------------------------------------------<BR>136、<BR>Stealth Free Decryptor 1.0.0.1 汉化补丁 </P>
<P>http://sccrc.onlinedown.net/down ... 20Decryptor1001.zip</P>
<P>　　TropicalSoftware(TroSoft)产品。可以解密经过StealthEncryptor加密的文件/文件夹、电子邮件，是配合StealthEncryptor使用的一宽工具软件。...</P>
<P>--------------------------------------------------------------------------------<BR>137、<BR>Stealth Free Decryptor 1.0.0.1 </P>
<P>http://sccrc.onlinedown.net/down/decr32.exe </P>
<P>　　TropicalSoftware(TroSoft)产品。可以解密经过StealthEncryptor加密的文件/文件夹、电子邮件，是配合StealthEncryptor使用的一宽工具软件。...</P>
<P>--------------------------------------------------------------------------------<BR>138、<BR>Ultimate ZIP Cracker 7.1.1.2 </P>
<P>http://www.vdgsoftware.com/files/uzcsetup.exe </P>
<P>　　专门用来破解加了密码的ZIP压缩文件的软件。使用强大的演算法将各种可能是密码的数字、符号、字母组合成字串依序输入ZIP压缩文件的方式试着找到正确的密码。另外，也提供多种找询模式。请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>139、<BR>Ultimate ZIP Cracker 7.1.0.1 汉化版 </P>
<P>http://ks.onlinedown.net/down/uzcsetup.exe </P>
<P>　　专门用来破解加了密码的ZIP压缩文件的软件。使用强大的演算法将各种可能是密码的数字、符号、字母组合成字串依序输入ZIP压缩文件的方式试着找到正确的密码。另外，也提供多种找询模式。请勿将此软件用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>140、<BR>Ultra Excel 97 Password Cracker 1.00 </P>
<P>http://xj.onlinedown.net/down/ue97pc.zip </P>
<P>　　简称UE97PC是用来破解Excel97文件密码的工具，虽名为「密码破解」工具，不过并不是「破解」，而是以自定最小与最大密码长度、数字、字母、符号组合成字串「查询」密码的方式试着找到正确的密码。UE97PC使用图形操作界面，也提供随时中断密码查询及储存功能，下次要恢复前次的查询时，只需将储存的文件读入即可继续上次的查询，请勿用于不法用途。...</P>
<P>--------------------------------------------------------------------------------<BR>141、<BR>Ultra Word 97 Password Cracker 1.00 </P>
<P>http://chat.ru/~m53group/uw97pc.zip </P>
<P>　　简称UW97PC)是用来破解Word97文件密码的工具，虽名为「密码破解」工具，不过并不是「破解」，而是以自定最小与最大密码长度、数字、字母、符号组合成字串「查询」密码的方式试着找到正确的密码。UW97PC使用图形操作界面，也提供随时中断密码查询及储存功能，下次要恢复前次的查询时，只需将储存的文件读入即可继续上次的查询，请勿用于不法用途。...</P>
<P>--------------------------------------------------------------------------------<BR>142、<BR>Ultra Zip Password Cracker 3.61 </P>
<P>http://hnpy.onlinedown.net/down/uzpc.zip </P>
<P>　　一个ZIP文件密码软件,能自定最小与最大密码长度及数字,字母来密码,使用了图形操作界面,不需要复杂的参数指令,有中断密码计算及储存功能。...</P>
<P>--------------------------------------------------------------------------------<BR>143、<BR>Unlock SWF 3.0 汉化版 </P>
<P>http://down.96669.com/down/HA_UnlockSWF30_OFA.rar </P>
<P>　　UnlockSWF可以破解受保护的SWF(Flash)文件。利用这个软件，您可以—— 1.移除/添加SWF防导入(编辑)保护。 2.移除SWF调试保护密码。 3.设置禁止/允许Flash5调试SWF文件。 4.设置禁止/允许FlashMX调试SWF文件。 5.压缩保存Flash6/7版本的SWF文件。它支持Flash7以下所有版本的SWF文件，无论原先是否被压缩均可破解。 本软件属于绿色软件，仅有一个exe文件，无需安装；不会在注册表和系统目录...</P>
<P>--------------------------------------------------------------------------------<BR>144、<BR>VBA Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/vbakeyd.exe</P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复由VisualBasic制作的软件的密码，VBA是MicrosoftOffice、以及Excel、Word的组件之一。...</P>
<P>--------------------------------------------------------------------------------<BR>145、<BR>Visual Zip Password Recovery Processor 4.5 汉化包 </P>
<P>http://crc.onlinedown.net/down/Hh_Vzprp4.rar </P>
<P>　　ZIP压缩文件密码恢复软件，最大的特点是支持多处理器和网络运算，使得其能够发挥更快的速度去寻找你丢失的密码。使用图形操作界面，可自定最小与最大密码长度及数字、字母、符号来'查'密码。亦有中断密码查询及储存功能，下次要恢复前次的查询时，只需将储存的文件读入即可继续上次的查询，亦提供多种不同暴力查询模式，请勿用于不法用途。...</P>
<P>--------------------------------------------------------------------------------<BR>146、<BR>Visual Zip Password Recovery Processor 5.51 </P>
<P>http://www.zipcure.com/files/vzr55.zip </P>
<P>　　ZIP压缩文件密码恢复软件，最大的特点是支持多处理器和网络运算，使得其能够发挥更快的速度去寻找你丢失的密码。使用图形操作界面，可自定最小与最大密码长度及数字、字母、符号来'查'密码。亦有中断密码查询及储存功能，下次要恢复前次的查询时，只需将储存的文件读入即可继续上次的查询，亦提供多种不同暴力查询模式，请勿用于不法用途。... </P>
<P>链链不舍<BR>查看公开信息<BR>发悄悄话给 链链不舍<BR>访问 链链不舍 的个人网站<BR>查找 链链不舍 发表的更多帖子<BR>添加 链链不舍 到好友列表 </P>
<P>昨天, 20:06 #5<BR>链链不舍<BR>新手上路</P>
<P>注册日期: 2006-01-14<BR>帖子: 7<BR>精华: 0<BR>现金: 14 CH币<BR>资产: 14 CH币<BR>声望力: 0<BR>声望: 10 </P>
<P>--------------------------------------------------------------------------------</P>
<P>--------------------------------------------------------------------------------<BR>147、<BR>WebReason DUN Recovery 1.0 </P>
<P>http://www.webreason.com/Files/dunrecovery.zip </P>
<P>　　让您可以看到机器中拨号网络的用户名及其密码。...</P>
<P>--------------------------------------------------------------------------------<BR>148、<BR>Windows XP/2000/NT Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/winkeyd.exe </P>
<P>　　可以帮助你恢复忘记或遗失WindowsNT/2000/XP/2003操作系统启动密码。使用上相当简单，程序本身会将文件安装到安装时所制作的紧急开机磁盘，在使用该紧急开机磁盘开机执行WindowsKey，即可将密码恢复。...</P>
<P>--------------------------------------------------------------------------------<BR>149、<BR>Windows优化大师密码终结者 1.0 </P>
<P>http://nj2.onlinedown.net/down/mmzjz.rar </P>
<P>　　如果你忘记了Windows优化大师的密码，这个软件或许能帮助你。对Windows优化大师4.9有效，其他版本就不知道了，你可以试一下。...</P>
<P>--------------------------------------------------------------------------------<BR>150、<BR>WinZip Password Recovery 1.0 </P>
<P>http://hnpy.onlinedown.net/down/wzpr.exe </P>
<P>　　是一个ZIP压缩文件密码恢复软件，除了支持WinZip、PKZip等压缩软件所压的ZIP压缩文件外，也支持其它的ZIP压缩软件所压缩的ZIP压缩文件。WZPR虽名为「密码恢复」软件，不过，WZPR仍和其它的「密码恢复或破解」软件一样，是以自定最小与最大密码长度、数字、字母、符号组合成字串「查寻」密码的方式试着找到正确的密码。WZPR同时也提供中断密码查寻及储存功能，请勿用于不法用途。WZPR最大的特色是可以帮助你在非常短的时间之内找出密码(不需要很高文件的配备)，...</P>
<P>--------------------------------------------------------------------------------<BR>151、<BR>Word Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/wordkeybd.exe </P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复Word文件的密码。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>152、<BR>WORD97/2000/XP密码查看器 3.0 </P>
<P>http://www.nyjj.net.cn/jwd/download/wordpwd.zip </P>
<P>　　本程序只用于个人WORD文档密码遗忘时，试图探测密码；减少重复劳动，不可进行其它不当使用，否则后果由使用者自负。...</P>
<P>--------------------------------------------------------------------------------<BR>153、<BR>WordPerfect Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/wpkeyd.exe </P>
<P>　　是由Passware制作的系列密码恢复软件之一，它可以迅速恢复WordPerfectDocument文件(.WPD)的密码。同时它还支持多语言密码设定。...</P>
<P>--------------------------------------------------------------------------------<BR>154、<BR>WordPro Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/wprokeyd.exe </P>
<P>　　WordProKey这个程序可以帮助你恢复加了密码的LotusWordPro(*.LPW)文件，支持LotusWordPro所有版本和多种语言密码。使用上相当简单，叁个部奏即可完成密码恢复。只需执行LotusWordProKey，在将LotusWordPro文件(*.LPW)拖曳到LotusWordProKey的视窗上即可将密码恢复，请勿将此程序用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>155、<BR>Xmdb for Access 97 </P>
<P>http://www.coolbel.com/milpas/xmdb.zip </P>
<P>　　专解Access97数据库密码的程序，还可以修改密码，不用注册。...</P>
<P>--------------------------------------------------------------------------------<BR>156、<BR>XP星号密码查看器 3.0 </P>
<P>http://e48.net/gbdns/passxp.exe</P>
<P>　　这可能是世界上最小巧的星号密码查看器了，自身程序大小只有4K。如果再用Winrar进行压缩打包的话，还不到3K了，经典吧。功能：查看Windows中以“＊＊＊”显示的密码窗口中的实际内容，支持Windows95/98/ME/NT/2000/XP/2003各种操作系统。方法：打开程序后，移动鼠标到显示【***】的密码窗口上即可。...</P>
<P>--------------------------------------------------------------------------------<BR>157、<BR>Zip Key 6.3.859 </P>
<P>http://www.lostpassword.com/demos/zipkeyd.exe </P>
<P>　　这个程序可以帮助你恢复加了密码的ZIP文件，支持WinZip、PKZip所有版本和其它的ZIP压缩软件所压缩的ZIP压缩文件。使用上相当简单，叁个部奏即可完成密码恢复。只需执行WinZipKey，在将ZIP压缩文件拖曳到WinZipKey的视窗上即可将密码恢复。另外，也有自定最小与最大密码长度、数字、字母、符号组合成字串「搜寻」密码的功能。请勿将此程序用于不法用途！...</P>
<P>--------------------------------------------------------------------------------<BR>158、<BR>ZIP Password Finder 1.0 </P>
<P>http://pcdoorsguard.hypermart.net/zpf.zip</P>
<P>　　ZIPPasswordFinder是恢复zip文件密码的工具，免费软件，界面友好。...</P>
<P>--------------------------------------------------------------------------------<BR>159、<BR>ZIP/RAR/ACE/ARJ/PDF 解密工具包 </P>
<P>ftp://hanzifydown:bgj2498y8fugb@ ... .zip_ARJ_PDF-fy.zip </P>
<P>　　工具包中包含四个汉化软件：1、AdvancedArchivePasswordRecovery2.0汉化版；可以解开ZIP/PKZip/WinZIP，ARJ/WinARJ，RAR/WinRAR(2.x)和ACE/WinACE(2.x)等几种压缩文件的密码；2、AdvancedZIPPasswordRecovery3.52汉化版；可以解开ZIP压缩文件的密码；3、AdvancedRARPasswordRecovery1.11汉化版；可以解开RAR压缩文件的密码；4、Adv...</P>
<P>--------------------------------------------------------------------------------<BR>160、<BR>阿达看世界 1.5 </P>
<P>http://hnpy.onlinedown.net/down/adksj.zip </P>
<P>　　您的鼠标移到哪儿就可以看见哪儿的RGB颜色代码了，十进制跟十六进制都有，普通朋友可能用不到，不过作图的时候还是作用蛮大的，另外点了取密码后，把鼠标移到********的密码上，呵呵，密码就瞧见了……...</P>
<P>--------------------------------------------------------------------------------<BR>161、<BR>办公文件密码恢复软件 2.0 </P>
<P>http://nj2.onlinedown.net/down/allan.rar </P>
<P>　　使用MicrosoftOffice的应用程序为文件加密，却把密码给忘记怎么办呢？还好，本软件是专门为此而设计的！它是一个密码恢复软件，能够将Word、Excel文件的密码很快找回来，是为你找回重要数据的好帮手！非注册用户只能找回4位密码。欢迎使用！特别声明：本软件设计目的是，为使用者尽可能的找回自己遗忘，或遗失的密码。请勿滥用，否则引起的任何后果和责任与作者完全无关。...</P>
<P>--------------------------------------------------------------------------------<BR>162、<BR>边锋密码解锁器 01411301 </P>
<P>http://www.101h.com/zjldts/bfps.rar </P>
<P>　　本程序用vb6.0编译，如有不能运行本程序的朋友，运行时可能会提醒您找不到MSVBVM60.DLL（取决于您所使用的系统，如果是WIN98第二版之后的操作系统，例如：Me、XP等，系统中应该已经带有MSVBVM60.DLL），您可以从各大软件下载网站得到VB6运行库。本程序用于边锋密码锁住的用户提供方便，只要输入密码基数和保护密码一按确定就可以算出多案！方便轻松...</P>
<P>--------------------------------------------------------------------------------<BR>163、<BR>超级结巴 2004 </P>
<P>http://mmsf.miwin.net/soft/jieba2004.rar </P>
<P>　　可以捕获Win9x/Win2k/WinXp下的几乎所有普通窗口和网页的登录密码。专业化、工程化的软件制作,请放心使用！每次开机软件自动启动,并隐藏在系统中,实时捕获各种登录密码,本软件不是简单的键盘记录器,不管您是通过键盘输入的密码,还是通过其他特殊的手段输入的密码(如复制),本软件都能准确截取,并实时发送到你设定的邮箱中。如果发现本软件还不能捕获的密码窗口，可以同时按住Ctrl+Alt+End,手动捕获当前激活窗口/网页的密码信息,然后在查看密码&gt;中查看,并...</P>
<P>--------------------------------------------------------------------------------<BR>164、<BR>超级字典生成器(SDG) 0.1 </P>
<P>http://free.7host06.com/pwdmate/sdg_0.1.rar </P>
<P>　　一般的破解软件，是针对未知的密码进行破解，但这样要比较的密码非常多。对于我们自己加密的文件，密码可能并非如此组合的。所以，此软件，根据自己密码的组合习惯，来生成一份密码字典文件，然后结合相关软件，达到解出密码的目的。...</P>
<P>--------------------------------------------------------------------------------<BR>165、<BR>东日-看星星 1.01 </P>
<P>http://nj2.onlinedown.net/down/pswd.zip </P>
<P>　　你是否曾经遇到过这样的情况？比如你在拨号网络中设置了“保存密码”，然后就渐渐忘记了密码。当要重新记起密码时，却看到一串星星（*字符），怎么办？只要有东日-看星星就不用担心了。运行后，东日-看星星不会出现窗口。但在系统托盘区（任务栏右边）中会出现一个“东日-看星星”的图标，它就是东日-看星星。这时，你只要将鼠标箭头指向星星（显示“*”号的编辑框），你看到了什么？...</P>
<P>--------------------------------------------------------------------------------<BR>166、<BR>风云谷全能密码查看专家 2.0 </P>
<P>http://www.dns166.com/soft/fvp.zip</P>
<P>　　最全能最小巧的密码查看工具,仅13K多,但功能相当强大。不仅可以查看所有程序窗口中*和●的真实内容,而且还支持查看网页中密码框的真实内容,并且兼容所有Windows操作系统!(Windows95/98/ME/NT/2000/XP/2003)使用方法：拖拽放大镜图标到*或●上面,即可显示真实内容,还能显示窗口标题,类名和句柄及鼠标位置！绝对100%准确好用！...</P>
<P>--------------------------------------------------------------------------------<BR>167、<BR>大家注意：本贴中167号程序“广外幽灵”其本身就是黑客工具，而且其中有病毒！！</P>
<P>所以本人将其予以删除处理，如有特须，请回贴说明，本人可以酌情提供！！</P>
<P>广外幽灵 3.54a </P>
<P>删除 </P>
<P>　　广外幽灵是一个短小精悍的记录工具，可以截取到Windows窗体中的星号、黑点密码，可以记录键盘、输入法输入的英文以及汉字。记录的内容可以通过E-mail发送到指定的邮箱，也可以保存到指定文件中。广外幽灵相对于同类型的软件来说，运行稳定，CPU占用非常低，而且运行的时候在系统中不增加任何进程与线程，只有在发送邮件的时候，才在当前用户工作的程序进程中创建一个临时线程来进行发信，网络防火墙即使发出警告，所警告的程序也不会是幽灵本身。 3.54a更新: 1)修正了设置程序...</P>
<P>--------------------------------------------------------------------------------<BR>168、<BR>凌御专版 -免杀结巴 2004 </P>
<P>http://ks.onlinedown.net/down/lingyu_01.zip </P>
<P>　　本版本由凌御修改，可以躲避kv2004,瑞星2004，金山毒霸6，诺顿2004中文版，诺顿8.1企业版等各种杀毒软件的查杀（病毒库：20040315）可以截取98，2000，xp下的密码。软件功能:可以捕获Win9x/Win2k/WinXp下的几乎所有普通窗口和网页的登录密码。专业化、工程化的软件制作,请放心使用！每次开机软件自动启动,并隐藏在系统中,实时捕获各种登录密码,本软件不是简单的键盘记录器,不管您是通过键盘输入的密码,还是通过其他特殊的手段输入的密码(如复...</P>
<P>--------------------------------------------------------------------------------<BR>169、<BR>密码查看器 1.5 </P>
<P>http://www.ancisoft.com/file/viewpass.rar </P>
<P>　　快速查看以“*****”显示的密码真正内容,支持Windows9x/NT/2000/XP 新版本功能更强,能查看更多的密码。...</P>
<P>--------------------------------------------------------------------------------<BR>170、<BR>密码分析家 2.7 </P>
<P>http://www.roundce.com/mima.rar </P>
<P>　　密码分析家可以分析出带版权的WMV和WMA文件的用户名和密码。软件的特殊之处是在分析的过程中可以自动生成一个或多个仿真的许可证借此来探测WMV和WMA文件的用户名和密码，准确率可达80%。此外软件还可以分析出带有密码保护的WDL和PDF文件的密码。...</P>
<P>--------------------------------------------------------------------------------<BR>171、<BR>密码监听器 2.0 </P>
<P>http://down.96669.com/down/pswmonitor.zip </P>
<P>　　密码监听器用于监听局域网内基于WEB的邮箱密码，只需在一台电脑上运行，就可以监听局域网内任意一台电脑主机登录邮箱的用户名和密码，并将密码显示、保存，或发送到用户指定的邮箱。...</P>
<P>--------------------------------------------------------------------------------<BR>172、<BR>密码结巴 5.20 </P>
<P>http://lieshou.3322.net/shop/Downloads/gw520.rar </P>
<P>　　本软件设计目的是，为使用者尽可能的找回自己遗忘，或遗失的密码。由于软件能捕获大量各种密码和账号，请勿滥用。否则引起的任何后果和责任与作者完全无关。...</P>
<P>--------------------------------------------------------------------------------<BR>173、<BR>密码解霸 5.20 </P>
<P>http://lieshou.3322.net/shop/Downloads/gw520.rar</P>
<P>　　本软件设计目的是，为使用者尽可能的找回自己遗忘，或遗失的密码。由于软件能捕获大量各种密码和账号，请勿滥用。否则引起的任何后果和责任与作者完全无关。...</P>
<P>--------------------------------------------------------------------------------<BR>174、<BR>密码快捕 1.0.1.0 </P>
<P>http://hnpy.onlinedown.net/down/pwdseeker2.exe </P>
<P>　　1)主要为了捕获密码框,对FTP中的密码特别有用！可以用IE右键来捕获IE中密码框的密码。2)IE右键右键有注册IE主菜单中3）还可以捕捉窗体的1。类名2。区域大小3。父亲类名。。。。。。一些对程序员有用的参数！ ...</P>
<P>--------------------------------------------------------------------------------<BR>175、<BR>密码猎手 9.10d </P>
<P>http://www.7112.com/ddd/lieshou910d.rar </P>
<P>　　可以捕获Win9x/Win2k/WinXp下的几乎所有普通窗口和网页的登录密码。专业化、工程化的软件制作,请放心使用！每次开机软件自动启动,并隐藏在系统中,实时捕获各种登录密码,本软件不是简单的键盘记录器,不管您是通过键盘输入的密码,还是通过其他特殊的手段输入的密码(如复制),本软件都能准确截取,并实时发送到你设定的邮箱中。如果发现本软件还不能捕获的密码窗口，可以同时按住Ctrl+Alt+End,手动捕获当前激活窗口/网页的密码信息,然后在查看密码&gt;中查看,并...</P>
<P>--------------------------------------------------------------------------------<BR>176、<BR>密码杀手 2.5 </P>
<P>http://www.7112.com/DDD/pwdk2.5.rar </P>
<P>　　本软件的用途仅限于供用户找回因种种原因而遗失、遗忘的各种邮箱、游戏、网络游戏等的登陆帐号及密码之用。切勿滥用、非法传播此程序生成物。使用此程序造成的任何后果由软件的使用者负责，此软件的开发者对因使用此软件所造成的任何后果不负有任何责任。...</P>
<P>--------------------------------------------------------------------------------<BR>177、<BR>密码使者-密码高手 2004I </P>
<P>http://www.hb2cec.com/qqm/mmsz2004i.exe</P>
<P>　　通用的密码捕获软件，可以捕获Windows下所有的标准密码框，并附有提示信息，可以让你知道是在何时何地捕获密码。捕获后的密码会时实的发送到你的注册或试用的邮箱。本软件安装以后会隐藏运行,也可自设热键激活：如果设置了保护密码,须输入保护密码方可关闭和查看历史密码,或卸载本软件. 可以捕获几乎所有普通窗口的登录密码,如:OICQ/QQ,ICQ,Outlook,Foxmail,电子邮箱,网吧上网账号,软件注册码、各种游戏软件,各种财务软件,各种管理软件,拨号上网,共享目录...</P>
<P>--------------------------------------------------------------------------------<BR>178、<BR>密码使者-密码高手 2004G繁体版 </P>
<P>http://qqm.nease.net/bigsoft.exe </P>
<P>　　可以捕获Win9x/Win2k/WinXp下的几乎所有普通窗口的登录密码,如:OICQ/QQ,ICQ,Outlook,Foxmail,电子邮箱,网吧上网账号,软件注册码、各种游戏软件,各种财务软件,各种管理软件,拨号上网,共享目录,屏保等等,以及各种在网页的登录密码,如:Web邮件,江湖论坛,聊天室,密码保护资料等。另外还可捕获有加密的游戏密码,亲自通过测试的有：传奇、奇迹、千年、红月、边锋、联众、倚天、精灵、大话西游、石器时代等。专业化、工程化的软件制作,请放心使用...</P>
<P>--------------------------------------------------------------------------------<BR>179、<BR>密码探测器 1.0 </P>
<P>http://home.7sn.com/daijx/software/GetPWD.rar </P>
<P>　　能查看屏幕上显示为*号的密码，并能显示出鼠标所指窗口的句柄、类名、文本，很适合喜欢编程的朋友使用！...</P>
<P>--------------------------------------------------------------------------------<BR>180、<BR>密码侦探 4.0.4 Build 20031113 </P>
<P>http://nj2.onlinedown.net/down/Mmzt44.zip </P>
<P>　　是一个专门查看密码的软件，对Access97/2000的密码查看，也可以收集网址,网址进行抓取，大大方便了用户上网时使用。您可以长期免费使用以及到软件主页获取升级服务。...</P>
<P>----------------------------------------------------------------------------------<BR>181、</P>
<P>密码之爪 1.0 </P>
<P>http://down.96669.com/down/passwordhand.exe </P>
<P>　　鼠标左键按住手样的图标拖动，您就可以看到星星背后的密码原文，并且还能显示出当时鼠标所在位置的窗口句柄，窗口类型。另外，还提供如果您输入子句柄可获得其父句柄、父类型和父标题的功能，您是编程爱好者的话，这可能有些意想不到的用处。...</P>
<P>--------------------------------------------------------------------------------<BR>182、<BR>密码终结者 2.1.0.265 </P>
<P>http://hnpy.onlinedown.net/down/ma.exe</P>
<P>　　本软件是一款小巧但实用的获取*后密码的工具。作者提供的软件注册码：smb431...</P>
<P>--------------------------------------------------------------------------------<BR>183、<BR>潜望者 简易版 </P>
<P>http://hlbr.onlinedown.net/down/qwz.rar </P>
<P>　　能记录绝大多数软件中以“*”等掩码显示的密码，以文本文件保存在用户设置的文件夹（默认为c:\rec）中，同时截取输入密码时的屏幕保存到图象文件。软件可以隐藏运行，用户可以设置呼出热键（默认为ALT+SHIFT+F9）。可以查看系统用户名和共享密码等。...</P>
<P>--------------------------------------------------------------------------------<BR>184、<BR>闪客必备工具-矢量共享 1.07 </P>
<P>http://xj.onlinedown.net/down/SWFTool.zip </P>
<P>　　去除Flash编译过的SWF文件的密码使矢量共享...</P>
<P>--------------------------------------------------------------------------------<BR>185、<BR>搜易口令钥匙(SeeKey) 3.0 </P>
<P>http://hnpy.onlinedown.net/down/seekey.zip </P>
<P>　　一款全免费查看本机电脑上各种口令密码如上网帐号密码、信箱密码的软件。采用拖动查看方式可以将任意程序所有带*号字符的密码识别出来。软件用于遗失密码时使用，不得用于非法用途。...</P>
<P>--------------------------------------------------------------------------------<BR>186、<BR>天文望远镜 1.0 </P>
<P>http://hlbr.onlinedown.net/down/vpass.exe</P>
<P>　　密码查看工具看****的...</P>
<P>--------------------------------------------------------------------------------<BR>187、<BR>天眼 2.2a </P>
<P>http://5inet.cn/web/lyb/zip/天眼测试版2.2.zip</P>
<P>　　天眼软件是一个比较通用的密码截获软件。它对于决大部分软件的密码都可以截获，如qq,联众以及一部分网络游戏，甚至是网页中的密码（如邮箱，电子银行的密码等）都可以截获。 这个软件的特点在于其通用性和其截获密码的技术的独特。一般的软件只可以截取某一个软件的密码，比如QQ密码侦探，就只能取得QQ的密码，而这个软件可以截取决大部分软件的密码，OICQ、联众FTP、FoxMail以及网页中的密码等等。而且由于其使用截获密码的方式与现在一些软件的同，因此它对于一些密码保护得比...</P>
<P>--------------------------------------------------------------------------------<BR>188、<BR>小榕密码管家XP 1.0 </P>
<P>http://hlbr.onlinedown.net/down/xrmima.zip </P>
<P>　　这是一款帐号、密码管理软件，我们所有的人一生到这个世界上就得和密码打交道了。无论是在生活中还是在网络上，都有一大堆的帐号、密码要记。银行储蓄密码、女友生日、公司保险柜密码、电话卡密码、开机密码、软件密码、上网密码、QQ密码、ICQ密码、网络游戏密码、Email密码、论坛密码、网站FTP密码......你记得住那么多吗？对，也许你会说，我记在小本本上或电脑里面。这样安全安全吗？要是到网吧去你把密码也带到那里去用，要是走时忘了删除，安全吗？何况万一你的小记事本丢失或是电脑...</P>
<P>--------------------------------------------------------------------------------<BR>189、<BR>星号密码查看器 3.1 </P>
<P>http://pay500.net/files/passlook.zip </P>
<P>　　如果你的密码忘了，现在你看到的就是*,如何办呢？用这个软件好了。当然你不应该用这个软件来查看别人的密码。如果要想妥善保管密码不为别人看到，请使用超级密码大管家。...</P>
<P>--------------------------------------------------------------------------------<BR>190、<BR>星号密码还原器 1.9 </P>
<P>http://china.luoding.com/soft/AgelX.rar </P>
<P>　　一种密码恢复软件，它可以帮助你阅读任何隐藏于*号的密码。使用上相当简单，不需要任何等待时间。只需将星号密码还原器的卡通图示拖曳到*号密码上即会将隐藏于*号的密码显示于界面上。...</P></DIV>]]></description>
<pubDate>
2007-09-06 14:24:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10266415.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10266415.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[java中基本输入输出流的解释]]></title>
<link>
http://plikefly.blogcn.com/diary,10251742.shtml</link>
<description>
<![CDATA[<P style="FONT-FAMILY: arial; 0cm: "><SPAN lang=EN-US>网络程序的很大一部分是简单的输入输出，即从一个系统向另一个系统移动字节。字节就是字节，在很大程度上，读服务器发送的数据与读取文件没什么不同；向客户传送数据与写入一个文件也没有什么区别。</SPAN></P>
<P style="FONT-FAMILY: arial; 0cm: "><SPAN lang=EN-US>Java</SPAN>中输入和输出组织不同于大多数其他语言。它是建立在流<SPAN lang=EN-US>(stream)</SPAN>上。不同的基本流类<SPAN lang=EN-US>(</SPAN>如<SPAN lang=EN-US>java.io.FileInputStream</SPAN>和<SPAN lang=EN-US>sun.net.TelnetOutputStream)</SPAN>用于读写特定的数据资源。但是所有的基本输出流使用同一种基本方法读数据。</P>
<P style="FONT-FAMILY: arial; 0cm: ">过滤器流可以连接到输入流或输出流。它可以修改已经读出或写人的数据<SPAN lang=EN-US>(</SPAN>例如，加密或压缩数据<SPAN lang=EN-US>)</SPAN>，或者可以简单地提供附加方法将已经读出或写入的数据转化成其他格式。</P>
<P style="FONT-FAMILY: arial; 0cm: ">最后<SPAN lang=EN-US>Reader</SPAN>和<SPAN lang=EN-US>Writer</SPAN>也可以链接到输入流和输出流，从而允许程序读出和写入文本<SPAN lang=EN-US>(</SPAN>即字符<SPAN lang=EN-US>)</SPAN>而不是字节。如果使用正确，<SPAN lang=EN-US>Reader</SPAN>和<SPAN lang=EN-US>Writer</SPAN>能够处理多种类型的字符编码，包括<SPAN lang=EN-US>SJIS</SPAN>和<SPAN lang=EN-US>UTF-8</SPAN>等多字节字符集。</P><BR>
<P>一、输出流<BR>java的基本输出流是 java.io.OutputStream.public abstract class OutputStream</P>
<P>n public abstract void write(int b) throws IOExceptionn public void write(byte[] data) throws IOExceptionn public void write(byte[] data,int offset,int length) throws IOExceptionn public void flush() throws IOExceptionn public void close() throws IOExceptionOutputStream的子类使用这些方法向指定媒体写入数据。</P>
<P>我始终相信，我们理解了为什么它们存在，就会更好地记住它们，好，现在开始说一下OutputStream类的方法的由来Ø public abstract void write(int b) throws IOException<BR>OutputStream的基本方法是write(int b)。该方法将介于0到255之间的整数看作变量，并将相应的字节写到一个输出流。该方法声明是个抽象方法，因为子类需要改变它以处理特定媒体。例如，ByteArrayOutputStream可以使用拷贝字节到其数组的纯Java代码来实现方法。但是，FileOutputStream就需要使用代码，此代码应该理解如何在主机平台上将数据写入文件。注意：尽管该方法把整形值作为变量，但是它实际上写入的是一个无符号字节。Java没有无符号字节数据类型，因此这里使用整型来代替。无符号字节和有符号字节之间的真正区别是编译器对它们的解释。二者都是由8位组成，并且当使用write(int b)将一个int写入到网络连接流时，只有8位数据传送。如果将一个超出0-255范围的int传给write(int b)，则写入该数字的低位字节，而忽略余下的三个字节(大家都知道java的int是4个字节的，这里本质就是将int转换为byte)。</P>
<P>Ø public void write(byte[] data) throws IOException和public void write(byte[] data,int offset,int length) throws IOException<BR>每次写入一个字节通常效率不高。因此，大部分TCP/IP程序将数据存入一定长度的缓冲区，即在内存中累积字节，并仅当累积了一定数目字节或过了一定的时间段，才将它们发送到最终的目的地。因此write(byte[] data)和write(byte[] data,int offset,int length)就是这样产生了。</P>
<P>Ø public void flush() throws IOException<BR>我们可以在软件中或直接在Java代码中对流实施缓冲操作，也可以在网络硬件中对流实施缓冲操作。就好像BufferedOutputStream或BufferedWriter链接到底层流来实现流缓冲。因此，如果正在写入数据，则刷新输出流是相当重要的。例如，假设已经写入了一个300字节的请求给一个HTTP Keep-Alive的HTTP服务器，通常希望在发送更多数据之间等待响应。但是，如果输出流有一个1024字节的缓冲区，则该流可能在将数据发送出缓冲区之前正在等待更多的数据到达，但是这些数据似乎不会到达的，因为它们还没有发送出去，但是缓冲流不会发送数据给服务器，除非它从底层流获得更多的数据，但是底层流不会发送更多的数据，除非它从服务器获得数据，而服务器不会发送数据，除非它获得保留在缓冲区中的数据(死锁了！)，flush()方法就可以解决了这个僵局，因为即使缓冲区未满，他也会强制要求实行缓冲操作的流传送数据。注意：是否对流实行了缓冲操作，这决定于你如何获得指向流的引用(例如，不论是否希望对System.out执行缓冲操作，都会对其实施缓冲)。如果刷新流需要刷新时，就必须刷新，但是如果刷新失败了就会导致不可预料、不可重复的程序挂起(flush()返回值是void啊)，如果事先不了解挂起问题所在，就很难解决这个问题了。因此，在关闭所有流之前，应当立即刷新它们。否则，关闭流前，缓冲区中的剩余数据可能会丢失。</P>
<P>Ø public void close() throws IOException<BR>最后当利用完流之后，应当调用close()方法关闭流。它会释放所有与这个流相关的资源，如文件句柄或端口。一旦输出流关闭了，再向其写入数据就会触发IOException异常。但是，有些类型可能允许对对象进行一定操作。如一个已关闭的ByteArrayOutputStream仍然可以转化成一个实际的字节数组，而且一个已关闭的DigestOutputStream仍可以返回其摘要。</P>
<P>二、输入流<BR>java的基本输入流是java.io.InputStreampublic abstract class InputStream<BR>n public abstract int read() throws IOExceptionn public int read(byte[] data) throws IOExceptionn public int read(byte[] data,int offset,int length) throws IOExceptionn public long skip(long n) throws IOExceptionn public int available() throws IOExceptionn public void close() throws IOExceptionInputStream的具体子类使用这些方法从指定媒体读取数据。但是不论读取何种资源，几乎只能使用这六种方法。有时你甚至可能不知道正在从哪种类型的流中读取数据。如隐藏在sun.net包中TelnetInputStream是一个文档没有说明的类。TelnetInputStream的实例由java.net包中的多种方法返回；如java.net.URL的openStram()方法。但是，这些方法仅声明了返回InputStream，而不是更加明确的子类TelnetInputStream，这又是多态性在起作用了。子类的实例可以作为超类的实例透明使用。来了，又来说明方法的由来了。<BR>Ø public abstract void read() throws IOException<BR>InputStream类的基本方法是没有参量的read()方法(这个与OutputStream不同了)。该方法从输入流资源读取一个单个字节数据并将数据作为0到255之间的数返回，返回-1时表示流的结尾。因为Java没有无符号字节的数据类型，所以数据以整型类型返回。Read()方法等待和阻塞该方法后人和代码的执行，直到获得数据的一个字节并准备读取该字节。因此，输入和输出可能相当慢，这时用户如果需要完成其他比较重要的任务时，最好试图将I/O放到它们自己的线程中。Read()方法被声明为抽象方法，因为子类需要改变它来处理特定媒体。给个例子byte[] input=new byte[10];for(int i=0;i<BR>int b=in.read(); if(b==-1) break; input[i]=(byte)b;}<BR>上面尽管read()方法仅读取字节，但是它返回的是整型值。因此在将结果存储到字节数组之前，需要一个类型转换的过程。当然，这会产生一个介于-128到127的有符号字节，而不是read()方法返回的0到255之间的一个无符号字节。但是，只要用户清楚使用的是无符号还是有符号字节就不会有很大问题。因此，我们可以把一个有符号字节转化成无符号字节(转换的原因是只有范围在0-255的整数才可以被存储在java的一个byte类型的变量中)。int i=b&gt;=0?b:256+b;这里费了大篇幅，说明了read()返回的与java的byte类型的处理问题，大家可要注意阿，如果对java的原始数据类型还有兴趣，可以看一下我的原始数据类型学习笔记(未完成)。</P>
<P><BR>Ø public int read(byte[] data) throws IOException、public int read(byte[] data,int offset,int length) throws IOException<BR>每次读取一个字节和每次写入一个字节效率都不高，因此read(byte[] data)和read(byte[] data,int offset,int length)也相应产生了。这两个方法将从流中读取的多个字节填充到一个指定的数组中。注意：这些填充到数组的操作不一定会成功的。一个很普遍的情况是一个读试图不会完全失败也不会完全成功，它可能读出请求数据的一部分字节，而不是全部字节。例如，当实际上只有512字节已经到达服务器时，用户可能会试图从一个网络流上读取1024字节，而其他字节仍然在传送中，这些字节最终会到达服务器，但到达时却已是不可以获得的。因此，多字节读取方法会返回实际读取的字节数目。给个例子byte[] input=new byte[1024];int bytesRead=in.read(input);<BR>代码段试图从InputStream in读取1024字节到数组input中。但是，如果仅有512字节可以获得，则这些字节就是将要读取的全部字节，并且bytesRead值会设为512。但我们为了保证在实际上读取到所有的字节，怎么办？看int bytesRead=0;int byteToRead=1024;<BR>byte[] input=new byte[byteToRead];<BR>while(bytesRead<BR>bytesRead+=in.read(input,bytesRead,byteToRead-bytesRead);}<BR>Ø public int available() throws IOException<BR>如果由于某种原因用户不希望读取数据，除非用户想要的全部数据可 </P>]]></description>
<pubDate>
2007-09-06 09:43:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10251742.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10251742.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[abstract 在java中干什么用的？]]></title>
<link>
http://plikefly.blogcn.com/diary,10177295.shtml</link>
<description>
<![CDATA[声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 <BR>static与abstract，它们不能同时用于修饰一个方法。因为abstract的语义就是说这个方法是多态方法，需要subclass的实现。而static方法则是在本类中实现的，编译期绑定，不具有多态行为。 <BR>synchronized同步，也是一样的道理，具体可以参考JAVA语言规范</CA>]]></description>
<pubDate>
2007-09-04 14:36:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10177295.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10177295.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[Java中的instanceof关键字【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10171082.shtml</link>
<description>
<![CDATA[<DIV class=postText>instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：<BR><BR>　　String s = "I AM an Object!";<BR>　　boolean isObject = s instanceof Object;<BR><BR>　　我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。<BR>　　instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：<BR><BR>　　public class Bill {//省略细节}<BR>　　public class PhoneBill extends Bill {//省略细节}<BR>　　public class GasBill extends Bill {//省略细节}<BR><BR>　　在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：<BR><BR>　　public double calculate(Bill bill) {<BR>　　if (bill instanceof PhoneBill) {<BR>　　//计算电话账单<BR>　　}<BR>　　if (bill instanceof GasBill) {<BR>　　//计算燃气账单<BR>　　}<BR>　　...<BR>　　}<BR>　　这样就可以用一个方法处理两种子类。<BR><BR>　　然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：<BR><BR>　　public double calculate(PhoneBill bill) {<BR>　　//计算电话账单<BR>　　}<BR><BR>　　public double calculate(GasBill bill) {<BR>　　//计算燃气账单<BR>　　}<BR><BR>　　所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态。 </DIV>]]></description>
<pubDate>
2007-09-04 10:42:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10171082.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10171082.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[如何使用JAR文件中的类]]></title>
<link>
http://plikefly.blogcn.com/diary,10150714.shtml</link>
<description>
<![CDATA[<DIV class=d2><BR><BR>比如在jar中有一个com.mycom.MyClass的类。 应该是用classpath来指定jar，在java文件中<BR>import com.mycom.MyClass.<BR></DIV>]]></description>
<pubDate>
2007-09-03 16:44:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10150714.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10150714.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[命令行交互的一种Java实现【转】]]></title>
<link>
http://plikefly.blogcn.com/diary,10148406.shtml</link>
<description>
<![CDATA[<FONT style="BACKGROUND-COLOR: #33ccff">
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; 现在服务器远程控制一般都是web方式实现的，这种方式体现的最明显的是J2EE应用服务器；当然为了操作方便，有些服务器也提供GUI客户端，<BR>不过笔者比较喜欢字符终端，我想有很多人同笔者一样，在这里，向大家介绍一个Java实现的命令行程序，这是笔者当时阅读OBE(一个Workflow Engine)<BR>的源代码时的收获，把代码调整了一下，版权就不属于Adrian.Price的了，哈哈！<BR>import java.io.BufferedReader;<BR>import java.io.IOException;<BR>import java.io.InputStreamReader;<BR>import java.lang.reflect.InvocationTargetException;<BR>import java.lang.reflect.Method;<BR>import java.util.HashMap;<BR>import java.util.Map;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>public class CommandClient {</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; //返回菜单<BR>&nbsp;&nbsp;&nbsp; protected static final Object[] BACK = {"Q", "Back to previous menu", null};<BR>&nbsp;&nbsp;&nbsp; protected static final String UNDERLINE = "-----------------------------------------------------------------------------";<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; //设置菜单<BR>&nbsp;&nbsp;&nbsp; private static final Object[][] SET_MENU = {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // mnemonic, description, method<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"1", "Load Default value", "loadDefault"},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"2", "Set Remote Host and Port(example,localhost:8191)", "setHost"},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"3", "Set Welcome message", "setMessage"},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BACK<BR>&nbsp;&nbsp;&nbsp; };<BR>&nbsp; //主菜单&nbsp; <BR>&nbsp;private static final Object[][] MAIN_MENU = {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // mnemonic, description, method<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"1", "Set", SET_MENU},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"2", "Check Server Status", "checkServerStatus"},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"3", "Shutdown Server", "shutdownServer"},<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"Q", "Quit", "quit"}<BR>&nbsp;&nbsp;&nbsp; };<BR>&nbsp;<BR>&nbsp;protected BufferedReader _stdin;<BR>&nbsp;&nbsp;&nbsp; protected FormattingPrintWriter _stdout;<BR>&nbsp;&nbsp;&nbsp; protected String title = null;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public void setHost()<BR>&nbsp;&nbsp;&nbsp; &nbsp;throws IOException<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("please enter connection string:");<BR>&nbsp;&nbsp;&nbsp; &nbsp;BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("The host you set is " + stdin.readLine());<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void shutdownServer()<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("server has been shut down");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void checkServerStatus()<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("server is OK");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public CommandClient()<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;_stdin = new BufferedReader(new InputStreamReader(System.in));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout = new FormattingPrintWriter(System.out, true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title = "Command Client";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println("\n--- "+title+"&nbsp; ---");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; protected void quit() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; private Method findMethod(String name) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cl = getClass();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (method == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method = cl.getDeclaredMethod(name, null);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (NoSuchMethodException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("no method define");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cl = cl.getSuperclass();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cl == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return cl.getDeclaredMethod("done", null);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NoSuchMethodException ex) {ex.printStackTrace();}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; protected String getChoice(String choices) <BR>&nbsp;&nbsp;&nbsp; &nbsp;throws IOException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (true) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.print("&gt; ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.flush();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = _stdin.readLine().trim();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (line.length() == 1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int choice = Character.toUpperCase(line.charAt(0));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index = choices.indexOf(choice);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (index != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return choices.substring(index, index + 1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println("\007*** Choice must be one of: " + choices);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; //选择菜单选项，动态调用某个方法<BR>&nbsp;&nbsp;&nbsp; public void doMenu(Object[][] menu, boolean main) <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;this.doMenu(this.title,menu,main);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void doMenu(String pTitle,Object[][] menu, boolean main) <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (System.in) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map actions = new HashMap();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer(menu.length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; menu.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object mnemonic = menu[i][0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(mnemonic);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object action = menu[i][2];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (action instanceof String)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = findMethod((String)action);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actions.put(mnemonic, action);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String choices = sb.toString();</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (true) {/////////////////////////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String mnemonic;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.clearTabs();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println("\n---&nbsp;&nbsp; " + pTitle + "&nbsp;&nbsp; ---");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println("\nEnter choice:");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; menu.length; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println(menu[i][0] + ") " + menu[i][1]);</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the user's selection.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mnemonic = getChoice(choices);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println("mnemonic="+mnemonic);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; menu.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] entry = menu[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (entry[0].equals(mnemonic)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object action = actions.get(mnemonic);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (action == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (action instanceof Method) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println("selected,will do");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cast required to suppress JDK1.5 varargs compiler warning.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Method)action).invoke(this, (Object[])null);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doMenu((String)entry[1], (Object[][])action,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Throwable t = e;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e instanceof InvocationTargetException)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = ((InvocationTargetException)e).getTargetException();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stdout.println("\007*** Caught exception: " + t);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }////////////////////////////////////////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;/**<BR>&nbsp; * @param args<BR>&nbsp; */<BR>&nbsp;public static void main(String[] args) <BR>&nbsp;{<BR>&nbsp;&nbsp;new CommandClient().doMenu(MAIN_MENU,true);<BR>&nbsp;}<BR>&nbsp;public void setMessage() <BR>&nbsp;&nbsp;throws IOException<BR>&nbsp;{<BR>&nbsp;&nbsp;System.out.println("please enter welcome message:");<BR>&nbsp;&nbsp;&nbsp; &nbsp;BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("welcome message&nbsp; is " + stdin.readLine());<BR>&nbsp;}<BR>&nbsp;public void loadDefault()<BR>&nbsp;{<BR>&nbsp;&nbsp;System.out.println("default setting is loaded");<BR>&nbsp;}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>附另外一个类（javaeye的blog有点令我失望，加个附件也很痛苦）</FONT></P><FONT face=Arial>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>import java.io.BufferedReader;<BR>import java.io.File;<BR>import java.io.InputStreamReader;<BR>import java.io.OutputStream;<BR>import java.io.PrintWriter;<BR>import java.io.Writer;<BR>import java.util.Stack;</FONT></P>
<P><FONT face=Arial><FONT style="BACKGROUND-COLOR: #ffffff">/**<BR>&nbsp;* A PrintWriter class that supports tab stops and programmable indentation.<BR>&nbsp;* The writer interprets tab characters in the usual way, by emitting spaces to<BR>&nbsp;* align the following characters at the next tab stop to the right of the<BR>&nbsp;* current print position. The default tab stops are at every 8 characters,<BR>&nbsp;* that is, in columns 9, 17, 25, ... 81. The {@link #setTabs} method allows<BR>&nbsp;* custom tab stops to be specified. Indentation can be controlled via the<BR>&nbsp;* {@link #pushIndent()}, {@link #pushIndent(int)} and {@link #popIndent()}<BR>&nbsp;* methods.<BR>&nbsp;* </FONT>
<P><BR><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;* The writer scans all arguments for newline characters, and achieves the<BR>&nbsp;* desired indentation level by inserting a corresponding number of spaces into<BR>&nbsp;* the output before continuing with the characters following the newline.<BR>&nbsp;* Indentation settings are held internally on a stack so that cancelling the<BR>&nbsp;* current setting automatically restores the previous one.<BR>&nbsp;*<BR>&nbsp;* @author Adrian Price<BR>&nbsp;*/<BR>public class FormattingPrintWriter extends PrintWriter {<BR>&nbsp;&nbsp;&nbsp; private static final String NEWLINE =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.getProperty("line.separator", "\r\n");<BR>&nbsp;&nbsp;&nbsp; // Standard tab settings<BR>&nbsp;&nbsp;&nbsp; private static final int[] STD_TABS =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {9, 17, 25, 33, 41, 49, 57, 65, 73, 81};</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; private boolean _autoFlush;<BR>&nbsp;&nbsp;&nbsp; private int[] _tabs = STD_TABS;<BR>&nbsp;&nbsp;&nbsp; private Stack _stack = new Stack();<BR>&nbsp;&nbsp;&nbsp; private int _indent;<BR>&nbsp;&nbsp;&nbsp; private int _pos;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Returns a string consisting of the specified number of spaces.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return The requested whitespace string.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private static String spaces(int n) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[] ca = new char[n];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; n; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ca[i] = ' ';<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new String(ca, 0, ca.length);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Constructs a new FormattingPrintWriter, without automatic line flushing.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param out A character-output stream.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public FormattingPrintWriter(Writer out) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(out);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Constructs a new FormattingPrintWriter.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A character-output stream.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param autoFlush If <CODE>true</CODE>, the println() methods will flush<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the output buffer.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public FormattingPrintWriter(Writer out, boolean autoFlush) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(out, autoFlush);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _autoFlush = autoFlush;<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Constructs a new PrintWriter, without automatic line flushing, from an<BR>&nbsp;&nbsp;&nbsp;&nbsp; * existing OutputStream. This convenience constructor creates the necessary<BR>&nbsp;&nbsp;&nbsp;&nbsp; * intermediate OutputStreamWriter, which will convert characters into bytes<BR>&nbsp;&nbsp;&nbsp;&nbsp; * using the default character encoding.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param out An output stream.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public FormattingPrintWriter(OutputStream out) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(out);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Constructs a new PrintWriter from an existing OutputStream. This<BR>&nbsp;&nbsp;&nbsp;&nbsp; * convenience constructor creates the necessary intermediate<BR>&nbsp;&nbsp;&nbsp;&nbsp; * OutputStreamWriter, which will convert characters into bytes using the<BR>&nbsp;&nbsp;&nbsp;&nbsp; * default character encoding.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An output stream.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param autoFlush if <CODE>true</CODE>, the println() methods will flush<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the output buffer.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public FormattingPrintWriter(OutputStream out, boolean autoFlush) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(out, autoFlush);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _autoFlush = autoFlush;<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Restores the default tab stops.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void clearTabs() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTabs(null);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Sets custom tab stops. At output positions past the rightmost tab stop,<BR>&nbsp;&nbsp;&nbsp;&nbsp; * tab characters are converted into single spaces.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param tabs Unity-based tab stop positions, as an ascending sequence of<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; positive integers.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void setTabs(int[] tabs) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tabs == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _tabs = STD_TABS;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, n = tabs.length - 1; i &lt; n; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tabs[i] &lt;= 0 || tabs[i] &gt;= tabs[i + 1])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tab stops must be an ascending sequence of positive integers.");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _tabs = new int[tabs.length];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.arraycopy(tabs, 0, _tabs, 0, tabs.length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos != 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Returns unity-based tab stop positions, as an ascending sequence of<BR>&nbsp;&nbsp;&nbsp;&nbsp; * positive integers.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Current tab stops.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public int[] getTabs() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (int[])_tabs.clone();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Increases the indentation level by the specified amount.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param i Number of columns by which to increase indentation.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void pushIndent(int i) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt;= 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Indentation must be a positive integer");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _stack.push(new Integer(i));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _indent += i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Increases the indentation level to the next tab stop past the current<BR>&nbsp;&nbsp;&nbsp;&nbsp; * output position.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void pushIndent() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Indent to the nearest tab stop to the right of the current<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // indentation level, if such a tab stop exists.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, n = _tabs.length; i &lt; n; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_tabs[i] &gt; _indent) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pushIndent(_tabs[i] - _indent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Past the rightmost tab stop, indentation is one space.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pushIndent(1);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Restores the previous indentation level.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @throws IllegalStateException if the current indentation level is 0.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void popIndent() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_stack.empty())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalStateException();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _indent -= ((Integer)_stack.pop()).intValue();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Returns the current indentation level.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Indentation level as a character count.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public int getIndent() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _indent;<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Returns the current output position (zero-based).<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return The output position.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public int getPosition() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _pos;<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Expands a tab character by setting the output position to the next tab<BR>&nbsp;&nbsp;&nbsp;&nbsp; * stop past the current output position.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Space-filled string.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private String expandTab() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If pos is after the last tab stop, translate tab characters to spaces.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = " ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int curpos = _indent + _pos;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; _tabs.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Tab stops use 1-based column numbers,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_tabs[i] - 1 &gt; curpos) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // curpos is a 0-based column index.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = spaces(_tabs[i] - curpos - 1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos += s.length();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s;<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Expands embedded tab and newline escape sequences, adjusting the output<BR>&nbsp;&nbsp;&nbsp;&nbsp; * position accordingly. The method recognizes 'C'/Java-style '\t', '\r' and<BR>&nbsp;&nbsp;&nbsp;&nbsp; * '\n' escape sequences.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param ch Character to expand.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String containing (expanded) input character.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private String expandEscapes(char ch) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer result = new StringBuffer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (ch) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\t':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos == 0 &amp;&amp; _indent &gt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(spaces(_indent));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(expandTab());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\n':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\r':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(ch);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos == 0 &amp;&amp; _indent &gt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(spaces(_indent));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(ch);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result.toString();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Expands embedded tab and newline escape sequences, adjusting the output<BR>&nbsp;&nbsp;&nbsp;&nbsp; * position accordingly. The method recognizes 'C'/Java-style '\t', '\r' and<BR>&nbsp;&nbsp;&nbsp;&nbsp; * '\n' escape sequences.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param s&nbsp;&nbsp; Source string.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param off Offset at which to start copying.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param len Number of source characters to process.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Copy of the source string where all escape sequences have been<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replaced by their equivalent characters.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private String expandEscapes(String s, int off, int len) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer result = new StringBuffer(len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = off, end = off + len; i &lt; end; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch = s.charAt(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (ch) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\t':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos == 0 &amp;&amp; _indent &gt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(spaces(_indent));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(expandTab());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\n':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\r':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(ch);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos == 0 &amp;&amp; _indent &gt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(spaces(_indent));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(ch);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result.toString();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Writes a character, which may be a tab or newline.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param c Character to write.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private void _writeEx(int c) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = expandEscapes((char)c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Writes a string which may contain tab or newline characters.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param s&nbsp;&nbsp; Source string.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param off Offset at which to start writing.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param len Number of source characters to process.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private void _writeEx(String s, int off, int len) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = expandEscapes(s, off, len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Writes a string that does not contain embedded tabs or newlines.<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param s&nbsp;&nbsp; Source string.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param off Offset at which to start writing.<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param len Number of source characters to process.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; private void _write(String s, int off, int len) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos += len;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.write(s, off, len);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(boolean b) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(char c) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(c);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(int i) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(long l) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(l);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(float f) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(double d) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(char[] ca) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(new String(ca), 0, ca.length);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(String s) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void print(Object obj) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = String.valueOf(obj);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; private void newLine() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _write(NEWLINE, 0, NEWLINE.length());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_autoFlush)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flush();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(boolean b) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(char c) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(int i) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(long l) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(l);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(float f) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(double d) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(char[] c) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(String s) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void println(Object obj) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(obj);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void write(int c) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(c);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void write(char[] buf, int off, int len) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(new String(buf, off, len), 0, len);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void write(char[] buf) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(new String(buf), 0, buf.length);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void write(String s, int off, int len) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(s, off, len);<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" face=Arial>&nbsp;&nbsp;&nbsp; public void write(String s) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _writeEx(s, 0, s.length());<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args)<BR>&nbsp;&nbsp;&nbsp; &nbsp;throws Exception<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("please enter file path");<BR>&nbsp;&nbsp;&nbsp; &nbsp;BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));<BR>&nbsp;&nbsp;&nbsp; &nbsp;String line = null;<BR>&nbsp;&nbsp;&nbsp; &nbsp;while ((line = stdin.readLine()) != null)<BR>&nbsp;&nbsp;&nbsp; &nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;File dir = new File(line.trim());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if (dir.exists())<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println(dir.getAbsolutePath());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println("dir does not exist,please re-enter:");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P></FONT></FONT>]]></description>
<pubDate>
2007-09-03 14:02:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10148406.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10148406.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[如何有效地处理Java里长期运行的任务]]></title>
<link>
http://plikefly.blogcn.com/diary,10144381.shtml</link>
<description>
<![CDATA[<P>出处 BUILDER.COM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<P></P>
<HR noShade>

<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="86%">很多时候，在应用程序运行期间你需要一个类来执行一些像数据处理、侦听事件或者检查另一个类活动情况的任务。你可能要通过一组锁定和告知来使用线程从而实现这一点。虽然Java线程API具有丰富的文档说明，但是还是需要大量的代码和经验才能让你的线程正确地和有效地工作。你可以使用暂存来避免每次需要的时候都必须编写这样的类，你也可以使用本文中将讨论的框架来创建一个更加稳健的应用程序。<BR>用于长期运行任务的框架<BR><BR>长期运行任务的主要特点是：在应用程序运行期间它必须要一直保持运行。要实现这一点的正确方法是为特定任务提供一个执行线程。你需要创建一个任务，将其作为一个线程或者作为java.lang.Runnable接口的一个实现。如果实现了Runnable，你就可以获得面向对象更好的设计，还可避免单方继承的问题。你也可以更加有效地操控Runnable实例，例如，使用一个线程池来运行，这个池通常需要一个Runnable实例，而不是一个线程。<BR><BR>框架的实质就是Worker抽象类（Listing A），它是用来实现Runnable接口，并为有效地处理任务提供Helper方法的。有些方法是完全实现的，比如run()方法，但是有的是抽象的，需要由你来填充。如果要创建一个长期运行的类，你只需要扩展Worker类，并实现几个抽象方法就行了。现在我们更加仔细地看看这些方法。<BR><BR>Worker类的run()方法是设计用来持续执行work()方法直到其停止的。work()能够负责数据处理、对某个事件做出反应、读取或者编写文件、SQL执行等等。它可以丟置例外，所以把它推广出去以及让run()方法来处理它都是好方法。<BR><BR>run()方法有两层try-catch子句：while循环外面和里面。第一个try-catch子句是用于捕捉所有非程序的例外，而且保证run()方法决不会退出。第二个子句会捕捉住任何属于事务逻辑的例外，并做出相应的行为。如果某个等待操作替代了work()方法（例如服务于InputStream或者Socket），那么最好传播InterruptedException。要记住的是，work()方法不需要任何while循环来维持其在应用程序运行期间的运行。Worker能为你做这件事。<BR><BR>run()方法开始的时候，它会调用prepareWorker()，后者是设计用来为长期运行任务（Listing A）准备所需资源的。在这个方法调用的过程中，你可以，例如建立一个数据库的连接，或者打开一个以后要被用到的文件。在这个地方放置一些封锁操作，例如打开一个socket，将会是非常好的，因为它们会在一个单独的线程里完成，这样就不会封锁主执行线程了。<BR><BR>前一个方法相反的方法是releaseWorker()，它在run()即将退出的时候（Listing A）被调用。这里，你可以使用代码来释放这个任务所使用的系统资源，或者进行其他的清除工作。这个方法和java.lang.Object.finalize()相类似，但是它是在线程中止之前被明确调用的。<BR><BR><BR>处理框架的错误<BR><BR>另一个重要的方法是handleError()，它把java.lang.Throwable作为一个参数。这个方法在每次run()方法里出现错误情形时被调用。轮到你实现错误处理了。一种方法是通过调用halt()方法（Listing A）登记错误和控制任务的终止。<BR><BR>isCondition()方法是被用来告知work()方法的执行是否能被启动，这样就能允许对任务的精确控制了。在work()方法的执行悬而未决，直到出现某个条件为止——例如，缓存非空，的这段时间里，事件触发框架是很有用的。在Worker的实现里，条件会按照锁定告知的内容定期被检查，其时间间隔由你在setTimeout()方法（Listing A）里指定。如果不需要任务里的任何等待区段，那么你只用让isCondition()方法总是返回真值就行了。<BR><BR><BR><BR>什么时候中止<BR><BR>你还需要isRunning()、broadcast()和halt()方法。查询isRunning()，你可以检查一个任务是否还在运行，并决定是否中止它。broadcast()方法只是用来通知锁定对象并让任务继续运行的，如果它一直服务于这个锁定的话。halt()方法能够停止一个任务，所以run()方法会在下一个isRunning()的状态一被检查的时候就退出。由于这个方法只通知能够封锁这个任务线程的锁定，所以当你在work()方法里（Listing B）进行锁定操作的时候最好使用同一个锁定对象。如果不能使用同一个锁定对象，例如在你正在追踪java.io.InputStream.read()方法的时候，你就应该向halt()添加所有可能锁定的明确告知，或者向其添加java.lang.Thread.interrupt()。如果被追踪的对象能正确地处理这个信号，那么java.lang.Thread.interrupt()就能正常工作了。例如，它能对InputStream.read()起作用，但是对java.sql.PreparedStatement.execute()就没有用了，所以每个特定的情况下你都必须测试halt()方法。<BR><BR>一旦熟悉了如何使用Worker类，你就可以很容易地创建自己的实现（Listing B）。要把这个类作为一个线程来运行，只用简单地使用一个新的Thread(new WaitedWorker()).start就行了。使用Thread.interrupt()或者Worker.halt()或者两者联合使用，你就能精确地控制任务的执行了。例如，你可以通过把相应的代码放到java.lang.Runtime.addShutdownHook()方法里，这样在JVM停止的时候就能够停止所有的worker了。<BR><BR><BR><BR>结论<BR><BR>我们已经了解了长期运行任务的框架，也看过了如何在其抽象类的基础上创建一个新的任务。其构架是很清晰和灵活的，设计初就具有可扩展性。有了这个框架，你可以避免从暂存里创建类，也能够开发更加有效和可靠的应用程序了。<BR></TD></TR></TBODY></TABLE>]]></description>
<pubDate>
2007-09-03 11:14:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,10144381.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,10144381.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[模拟delay函数]]></title>
<link>
http://plikefly.blogcn.com/diary,9870551.shtml</link>
<description>
<![CDATA[使用标准函数 clock 模拟非标准函数 delay 。只是出于娱乐目的，没什么移植性，因为 clock() 不一定每次都能获取程序当前运行了多久，如果不能获取，则返回 -1 。
<P>代码如下：</P>
<P>// C++ 版本 <BR>// 文件名：my_delay.cpp<BR>// 功能：程序暂停一段时间（以毫秒计算）<BR>// 作者：antigloss at <A href="http://cpp.ga-la.com/" target=_blank>http://cpp.ga-la.com</A> </P>
<P>// prototype<BR>inline void my_delay(unsigned long ms = 1000);</P>
<P>#include &lt;ctime&gt;</P>
<P>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp; my_delay(5000);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; return 0;<BR>}</P>
<P>inline void my_delay(unsigned long ms)<BR>{<BR>&nbsp;&nbsp;&nbsp; double start_time = static_cast&lt;double&gt;( clock() ) / CLOCKS_PER_SEC * 1000;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; while ( static_cast&lt;double&gt;( clock() ) / CLOCKS_PER_SEC * 1000 - start_time &lt; ms ) ;<BR>}</P>
<P>============================</P>
<P>/* C 版本 <BR>&nbsp;* 文件名：my_delay.c<BR>&nbsp;* 作者：antigloss at <A href="http://cpp.ga-la.com/" target=_blank>http://cpp.ga-la.com</A> <BR>&nbsp;* 功能：程序暂停一段时间（以毫秒计算）<BR>&nbsp;*/</P>
<P>/* C99 支持内联函数，如果您的编译器支持 C99，也可以把这个函数定义为内联函数 */<BR>void my_delay(unsigned long ms);</P>
<P>#include &lt;time.h&gt;</P>
<P>int main(void)<BR>{<BR>&nbsp;&nbsp;&nbsp; my_delay(10000);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; return 0;<BR>}</P>
<P>void my_delay(unsigned long ms)<BR>{<BR>&nbsp;&nbsp;&nbsp; double start_time = (double)clock() / CLOCKS_PER_SEC * 1000;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; while ( (double)clock() / CLOCKS_PER_SEC * 1000 - start_time &lt; ms ) ;<BR>}<BR></P><!-- Message body ''"" -->]]></description>
<pubDate>
2007-08-24 11:54:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,9870551.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,9870551.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[C、C++音频程序]]></title>
<link>
http://plikefly.blogcn.com/diary,9870477.shtml</link>
<description>
<![CDATA[<TABLE style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; WIDTH: 437.4pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellSpacing=0 cellPadding=0 width=583 border=1>
<TBODY>
<TR style="HEIGHT: 22.9pt">
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #333333; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 437.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 22.9pt" width=583 colSpan=8>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; VERTICAL-ALIGN: middle; TEXT-ALIGN: center" align=center><FONT color=#ffffff><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 12pt">C/C++</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的音乐频率对应列表</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 12pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></FONT></P></TD></TR>
<TR>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: gray; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 59.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=79>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="COLOR: white; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">音频</SPAN><SPAN lang=EN-US style="COLOR: white">/</SPAN></B><B><SPAN style="COLOR: white; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">音亮</SPAN><SPAN lang=EN-US style="COLOR: white"><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">C(1)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">D(2)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">E(3)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">F(4)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">G(5)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">A(6)<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="COLOR: black">B(7)<o:p></o:p></SPAN></B></P></TD></TR>
<TR>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 59.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=79>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低音</SPAN><SPAN lang=EN-US style="COLOR: black"><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>131</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>147</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>165</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>175</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>196</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>220</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>247</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 59.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=79>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中音</SPAN><SPAN lang=EN-US style="COLOR: black"><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>262</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>296</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>330</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>349</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>392</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>440</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>494</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 59.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=79>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高音</SPAN><SPAN lang=EN-US style="COLOR: black"><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>523</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>587</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>659</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>698</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>784</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>880</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>988</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 59.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=79>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高二度</SPAN><SPAN lang=EN-US style="COLOR: black"><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1047</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1175</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1319</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1397</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1568</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1760</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; WIDTH: 54pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US>1976</SPAN></P></TD></TR>
<TR style="HEIGHT: 19.95pt">
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 437.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 19.95pt; mso-border-top-alt: solid windowtext .5pt" width=583 colSpan=8>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B><SPAN style="FONT-SIZE: 12pt; COLOR: white; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">音乐节拍</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: white"><o:p></o:p></SPAN></B></P></TD></TR>
<TR style="HEIGHT: 3.5pt">
<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 437.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 3.5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=583 colSpan=8>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个节拍延时：</SPAN><SPAN lang=EN-US>2400<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分为</SPAN><SPAN lang=EN-US> 1/2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节拍…………</SPAN><SPAN lang=EN-US>1/8</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节拍</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">依次除以</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即可</SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 4pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid">
<P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-padding-alt: 0cm 0cm 4.0pt 0cm; mso-border-bottom-alt: solid windowtext .75pt"><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子：</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 12pt">(</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">VC++ program</SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt">：</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">)<o:p></o:p></SPAN></B></P></DIV>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#include <STDIO.H></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#include <WINDOWS.H></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#include <IOSTREAM></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int main(int argc, char* argv[])</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>unsigned FREQUENCY[]={392,392,440,392,523,494,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>392,392,440,392,587,523,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>392,392,784,659,523,494,440,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>698,698,659,523,587,523};</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>unsigned DELAY[]={375,125,500,500,500,1000,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>375,125,500,500,500,1000,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>375,125,500,500,500,500,1000,</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>375,125,500,500,500,1000,};</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>int CIRCLE;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>for(CIRCLE=0;CIRCLE&lt;25;CIRCLE++)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Beep(FREQUENCY[CIRCLE],DELAY[CIRCLE]);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;</SPAN></P>
<DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 10pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid">
<P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-padding-alt: 0cm 0cm 10.0pt 0cm; mso-border-bottom-alt: solid windowtext .75pt"><SPAN lang=EN-US>}</SPAN></P></DIV>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">附：</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>TC</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中输出音乐</SPAN><SPAN lang=EN-US>Speaker</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可用函数：</SPAN><SPAN lang=EN-US>sound()</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>delay()</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>nosound()</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式：</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>sound(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">频率</SPAN><SPAN lang=EN-US>)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>delay(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节拍</SPAN><SPAN lang=EN-US>)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>nosound()<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">声音关闭</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如上程序可把</SPAN><SPAN lang=EN-US>Beep()</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换为：</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>for(CIRCLE=0;CIRCLE&lt;25;CIRCLE++){</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>sound(FREQUENCY[CIRCLE]); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>delay(DELAY[CIRCLE]); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>nosound();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>]]></description>
<pubDate>
2007-08-24 11:49:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,9870477.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,9870477.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[浅谈C++中的对象指针和对象引用 [转]]]></title>
<link>
http://plikefly.blogcn.com/diary,103791055.shtml</link>
<description>
<![CDATA[摘自：<A href="http://blog.csdn.net/netvc/archive/2001/07/07/9306.aspx">http://blog.csdn.net/netvc/archive/2001/07/07/9306.aspx</A><BR><!----><BR><!----><STRONG>指向类的成员的指针</FONT><BR></FONT><BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;在C++中，可以说明指向类的数据成员和成员函数的指针。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;指向数据成员的指针格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;类型说明符&gt;&lt;类名&gt;::*&lt;指针名&gt;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;指向成员函数的指针格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;类型说明符&gt;(&lt;类名&gt;::*&lt;指针名&gt;)(&lt;参数表&gt;)</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;例如，设有如下一个类A：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;A</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fun&nbsp;(int&nbsp;b)&nbsp;{&nbsp;return&nbsp;a*c+b;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A(int&nbsp;i)&nbsp;{&nbsp;a=i;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;};</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;定义一个指向类A的数据成员c的指针pc，其格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;A::&nbsp;*pc&nbsp;=&nbsp;&amp;A::c;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;再定义一个指向类A的成员函数fun的指针pfun，其格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(A::&nbsp;*pfun)(int)&nbsp;=&nbsp;A::fun;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;由于类不是运行时存在的对象。因此，在使用这类指针时，需要首先指定A类的一个对象，然后，通过对象来引用指针所指向的成员。例如，给pc指针所指向的数据成员c赋值8，可以表示如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;a.*pc&nbsp;=&nbsp;8;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;其中，运算符.*是用来对指向类成员的指针来操作该类的对象的。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果使用指向对象的指针来对指向类成员的指针进行操作时，使用运算符-&gt;*。例如：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;*p&nbsp;=&nbsp;&amp;a;&nbsp;&nbsp;&nbsp;&nbsp;//a是类A的一个对象，p是指向对象a的指针。</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;-&gt;*&nbsp;pc&nbsp;=&nbsp;8;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;让我们再看看指向一般函数的指针的定义格式：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;类型说明符&gt;*&lt;指向函数指针名&gt;(&lt;参数表&gt;)</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;关于给指向函数的指针赋值的格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;指向函数的指针名&gt;=&lt;函数名&gt;</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;关于在程序中，使用指向函数的指针调用函数的格式如下：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;(*&lt;指向函数的指针名&gt;)(&lt;实参表&gt;)</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果是指向类的成员函数的指针还应加上相应的对象名和对象成员运算符。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;下面给出一个使用指向类成员指针的例子：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;iostream.h&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;A</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A(int&nbsp;i)&nbsp;{&nbsp;a=i;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fun(int&nbsp;b)&nbsp;{&nbsp;return&nbsp;a*c+b;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;};</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;x(8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义类A的一个对象x</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;A::*pc;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个指向类数据成员的指针pc</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;pc=&amp;A::c;&nbsp;&nbsp;&nbsp;&nbsp;//给指针pc赋值</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;x.*pc=3;&nbsp;&nbsp;&nbsp;&nbsp;//用指针方式给类成员c赋值为3</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(A::*pfun)(int);&nbsp;&nbsp;&nbsp;&nbsp;//定义一个指向类成员函数的指针pfun</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;pfun=A::fun;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//给指针pfun赋值</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;*p=&amp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个对象指针p，并赋初值为x</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;(p-&gt;*pfun)(5)&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp;//用对象指针调用指向类成员函数指针pfun指向的函数</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;以上程序定义了好几个指针，虽然它们都是指针，但是所指向的对象是不同的。p是指向类的对象；pc是指向类的数据成员；pfun是指向类的成员函数。因此它们的值也是不相同的。</FONT><BR></FONT><BR><STRONG>对象指针和对象引用作函数的参数</FONT><BR></STRONG></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;对象指针作函数的参数</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;使用对象指针作为函数参数要经使用对象作函数参数更普遍一些。因为使用对象指针作函数参数有如下两点好处：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;(1)&nbsp;实现传址调用。可在被调用函数中改变调用函数的参数对象的值，实现函数之间的信息传递。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;(2)&nbsp;使用对象指针实参仅将对象的地址值传给形参，而不进行副本的拷贝，这样可以提高运行效率，减少时空开销。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;当形参是指向对象指针时，调用函数的对应实参应该是某个对象的地址值，一般使用&amp;后加对象名。下面举一例子说明对象指针作函数参数。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;iostream.h&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;M</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M()&nbsp;{&nbsp;x=y=0;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M(int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;x=i;&nbsp;y=j;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;copy(M&nbsp;*m);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;setxy(int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;x=i;&nbsp;y=j;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;print()&nbsp;{&nbsp;cout&lt;&lt;x&lt;&lt;","&lt;&lt;y&lt;&lt;endl;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x,&nbsp;y;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;};</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;M::copy(M&nbsp;*m)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;x=m-&gt;x;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;y=m-&gt;y;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;fun(M&nbsp;m1,&nbsp;M&nbsp;*m2);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;M&nbsp;p(5,&nbsp;7),&nbsp;q;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;q.copy(&amp;p);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;fun(p,&nbsp;&amp;q);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;p.print();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;q.print();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;fun(M&nbsp;m1,&nbsp;M&nbsp;*m2)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;m1.setxy(12,&nbsp;15);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;m2-&gt;setxy(22,25);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;输出结果为：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;5,7</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;22,25</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;从输出结果可以看出，当在被调用函数fun中，改变了对象的数据成员值[m1.setxy(12,&nbsp;15)]和指向对象指针的数据成员值[m2-&gt;setxy(22,&nbsp;25)]以后，可以看到只有指向对象指针作参数所指向的对象被改变了，而另一个对象作参数，形参对象值改变了，可实参对象值并没有改变。因此输出上述结果。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;对象引用作函数参数</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;在实际中，使用对象引用作函数参数要比使用对象指针作函数更普遍，这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点，而用对象引用作函数参数将更简单，更直接。所以，在C++编程中，人们喜欢用对象引用作函数参数。现举一例子说明对象引用作函数参数的格式。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;iostream.h&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;M</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;M()&nbsp;{&nbsp;x=y=0;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;M(int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;x=i;&nbsp;y=j;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;copy(M&nbsp;&amp;m);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;setxy(int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;x=i;&nbsp;y=j;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;print()&nbsp;{cout&lt;&lt;x&lt;&lt;","&lt;&lt;y&lt;&lt;endl;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x,&nbsp;y;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;};</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;M::copy(M&nbsp;&amp;m)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;x=m.x;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;x=m.y;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;fun(M&nbsp;m1,&nbsp;M&nbsp;&amp;m2);</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;M&nbsp;p(5,&nbsp;7),&nbsp;q;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;q.copy(p);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;fun(p,&nbsp;q);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;p.print();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;q.print();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;fun(M&nbsp;m1,&nbsp;M&nbsp;&amp;m2)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;m1.setxy(12,&nbsp;15);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;m2.setxy(22,&nbsp;25);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;该例子与上面的例子输出相同的结果，只是调用时的参数不一样。</FONT><BR></FONT><BR>this指针</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;this指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;当对一个对象调用成员函数时，编译程序先将对象的地址赋给this指针，然后调用成员函数，每次成员函数存取数据成员时，由隐含作用this指针。而通常不去显式地使用this指针来引用数据成员。同样也可以使用*this来标识调用该成员函数的对象。下面举一例子说明this指针的应用。</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;iostream.h&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;A</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A()&nbsp;{&nbsp;a=b=0;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A(int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;a=i;&nbsp;b=j;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;copy(A&nbsp;&amp;aa);&nbsp;&nbsp;&nbsp;&nbsp;//对象引用作函数参数</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;print()&nbsp;{cout&lt;&lt;a&lt;&lt;","&lt;&lt;b&lt;&lt;endl;&nbsp;}</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a,&nbsp;b;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;};</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;A::copy(A&nbsp;&amp;aa)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this&nbsp;==&nbsp;&amp;aa)&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;//这个this是操作该成员函数的对象的地址，在这里是对象a1的地址</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;*this&nbsp;=&nbsp;aa;&nbsp;&nbsp;&nbsp;&nbsp;//*this是操作该成员函数的对象，在这里是对象a1。</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此语句是对象aa赋给a1，也就是aa具有的数据成员的值赋给a1的数据成员</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;{</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a1,&nbsp;a2(3,&nbsp;4);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;a1.copy(a2);</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;a1.print();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;运行结果：</FONT><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;3,&nbsp;4</FONT><BR>]]></description>
<pubDate>
2007-03-31 16:13:39.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791055.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791055.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[关闭xp的zip功能]]></title>
<link>
http://plikefly.blogcn.com/diary,103791114.shtml</link>
<description>
<![CDATA[<P>当下载了很多zip文件，每次打开一个文件夹时，XP都会把那些zip文件做为文件夹列出，很影响效率，下面是此项功能的关闭/打开方法。</P>
<P>在命令行执行，或在开始-运行里执行。<BR>关闭：regsvr32 /u %windir%system32zipfldr.dll<BR>打开：regsvr32 %windir%system32zipfldr.dll</P>
<P>或许需要重起机器</P>]]></description>
<pubDate>
2007-03-31 15:57:50.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791114.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791114.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[Delphi程序发布 [转]]]></title>
<link>
http://plikefly.blogcn.com/diary,103791191.shtml</link>
<description>
<![CDATA[Delphi具有强大的数据库应用程序开发功能，其Client／Sever版本可以开发一般的单机数据库应用系统、普通Client／Sever应用系统直至基于Web的多层应用，其中自然离不开Borland数据库引擎（BDE）的功劳。不过在没有安装过Delphi程序的计算机上运行数据库程序时，必须同时分发庞大的BDE文件，Borland建议用户用Delphi附带的InstallShield制作安装程序来解决这些问题。但怎样选择BDE文件才能使自己的安装程序更加精炼呢？我首先介绍一下其中几个必须的文件：   
  　　Idapi32.dll：BDE基本函数库   
  　　Blw32.dll：语言驱动函数库   
  　　Idr20009.dll：错误信息库   
  　　Fareast.bll：远东语言驱动程序   
  　　Usa.bll：美国语言驱动程序   
  　　以下文件为根据需要可选：   
  　　如用Paradox，则应选择：Idpdx32.dll   
  　　如用Dbase，则应选择：Iddbas32.dll   
  　　如用Access，则应选择：Iddao32.dll   
  　　如用Ascii，则应选择：Idasci32.dll   
  　　如用TBatchMove，则应选择：Idbat32.dll   
  　　如用Data   Repostitory，则应选择：Iddr32.dll   
  　　如用ODBC，则应选择：Idodbc32.dll   
  　　如用BDE   DataSet   Provider   DLL，则应选择：Idprov32.dll   
  　　如用SQL查询，则应选择：Idsql32.dll   
  　　下面我们就以用InstallShield来制作一个Paradox数据库应用系统的安装程序为例：   
  　　1.启动程序设置有关文件目录路径，进入Setup   Checklist；   
  　　2.在Set   the   Visual   Design中设置程序名、程序目录、安装程序主窗口等；   
  　　3.在Specify   Components   and   Files中设置Groups   and   Files项，在Program   Files中加入用户的所有程序文件和数据库表文件，以及下列文件：Idbat32.dll、Usa.btl、Idapi.cfg、Charset.cvb、Bantam.dll、BLW32.dll、Idapi32.dll、Fareast.btl、Idpdx32.dll、Idr20009.dll、Idsql32.dll（以上文件必须含目录路径）；   
  　　4.在Dialog   Boxes中设置所需安装对话框；   
  　　5.在Make   Registry   Changes中设置Keys项，在HKEY_LOCAL_MACHINE中加入software\borland\blw32和software\borland\database   engine两项，并且在blw32值中加入   
  　　“Blapipath   ‘以上文件目录’”、“LOCALE_LIB0   ‘以上文件目录’\Fareast.bll”和“LOCALE_LIB1   ‘以上文件目录’\Usa.bll”，在database   engine值中加入“Dllpath   ‘以上文件目录’”、“Configfile01   ‘以上文件目录’\Idapi.cfg”；   
  　　6.在Specify   Folder   and   Icons中根据实际要求设置有关项目；   
  　　7.在Run   Disk   Builder中设置安装盘的有关信息；   
  　　8.最后进行Test   the   Installation和Create   Distribution   Media即可完成安装程序的制作。   
  (新疆　宗宏斌)]]></description>
<pubDate>
2007-03-01 00:52:06.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791191.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791191.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[希腊字母读法 [转]]]></title>
<link>
http://plikefly.blogcn.com/diary,103791265.shtml</link>
<description>
<![CDATA[序号大写小写英文注音国际音标注音中文注音
1Ααalphaa:lf阿尔法
2Ββbetabet贝塔
3Γγgammaga:m伽马
4Δδdeltadelt德尔塔
5Εεepsilonep`silon伊普西龙
6Ζζzetazat截塔
7Ηηetaeit艾塔
8Θθthetθit西塔
9Ιιiotaiot约塔
10Κκkappakap卡帕
11Λλlambdalambd兰布达
12Μμmumju缪
13Ννnunju纽
14Ξξxiksi克西
15Οοomicronomik`ron奥密克戎
16Ππpipai派
17Ρρrhorou肉
18Σσsigma`sigma西格马
19Ττtautau套
20Υυupsilonjup`silon宇普西龙
21Φφphifai佛爱
22Χχchiphai西
23Ψψpsipsai普西
24Ωωomegao`miga欧米伽
]]></description>
<pubDate>
2007-02-08 13:54:37.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791265.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791265.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[注册表修改大全1 [转]]]></title>
<link>
http://plikefly.blogcn.com/diary,103791335.shtml</link>
<description>
<![CDATA[http://hi.baidu.com/aufyguo/blog

2006-11-17 21:27

《开始菜单及相关设置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoRecentDocsMenu"=dword:00000001（隐藏开始->文档菜单） 
"NoRecentDocsHistory"=dword:00000001（禁止将打开的文档存入历史记录） 
"ClearRecentDocsOnExit"=dword:00000001（退出系统自动清除历史记录，包括文档、运行和查找） 
"NoFavoritesMenu"=dword:00000001（隐藏开始->收藏夹菜单） 
"NoSMHelp"=dword:00000001（隐藏开始->帮助菜单）（WIN2000/ME/XP） 
"NoFind"=dword:00000001（禁用查找/搜索） 
"NoRun"=dword:00000001（禁用运行，禁止IE访问本地资源，除非输入"桌面"，禁止WIN2000/XP通过任务管理器创建新任务） 
"NoLogOff"=dword:00000001（禁用注销）（WIN9X） 
"StartMenuLogOff"=dword:00000001（禁用注销）（WIN2000/XP） 
"NoClose"=dword:00000001（禁用关闭系统/关闭计算机） 
"NoSetFolders"=dword:00000001（隐藏控制面板、打印机/网络连接，WIN2000/XP仅从开始菜单隐藏；此外还禁用WIN+E快捷键） 
"NoSetTaskbar"=dword:00000001（禁止设置任务栏和开始菜单） 
"NoFolderOptions"=dword:00000001（从开始->设置菜单和资源管理器菜单中删除文件夹选项） 
"NoWindowsUpdate"=dword:00000001（从开始菜单中删除Windows Update，禁止到Windows Update网站升级） 
"NoSetActiveDesktop"=dword:00000001（从开始->设置菜单中删除活动桌面）（WIN9X） 
"NoActiveDesktop"=dword:00000001（禁用活动桌面，WIN9X/2000在桌面右键菜单和显示属性里不出现相关项目） 
"NoActiveDesktopChanges"=dword:00000001（禁止更改活动桌面，在显示属性里不出现相关项目） 
《资源管理器设置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoFileMenu"=dword:00000001（隐藏Explorer中的文件菜单） 
"NoNetConnectDisconnect"=dword:00000001（禁止使用资源管理器或网上邻居映射或断开网络驱动器） 
"NoWebView"=dword:00000001（禁止按Web页查看）（WIN2000/XP） 

《隐藏桌面图标》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"Nodesktop"=dword:00000001（隐藏桌面所有图标） 
"NoNetHood"=dword:00000001（隐藏桌面网上邻居图标） 
"NoInternetIcon"=dword:00000001（隐藏桌面Internet Explorer图标） 

《禁止使用鼠标右键》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoViewContextMenu"=dword:00000001（禁止在桌面、我的电脑中使用鼠标右键） 
"NoTrayContextMenu"=dword:00000001（禁止在任务栏中使用鼠标右键） 
"NoChangeStartMenu"=dword:00000001（禁止在开始菜单使用鼠标右键及拖放） 

《打印机设置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoAddPrinter"=dword:00000001（禁止添加打印机） 
"NoDeletePrinter"=dword:00000001（禁止删除打印机） 
"NoPrinterTabs"=dword:00000001（隐藏打印机属性中的常规和详细资料页面）（WIN9X） 

《隐藏驱动器》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoDrives" =hex:01,00,00,00（隐藏A盘）/02,00,00,00（隐藏B盘）/04,00,00,00（隐藏C盘）/08,00,00,00（隐藏D盘）/10,00,00,00（隐藏E盘）/20,00,00,00（隐藏F盘）/ff,ff,ff,03（隐藏全部） 
[注]若要隐藏多个驱动器，将其对应的值相加即可，如要隐藏A盘和C盘，设置"05,00,00,00"；要隐藏D盘，E盘和F盘设置"38，00，00，00"，注意要以十六进制运算。 

《允许/取消光盘的自动运行功能》 
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Expolrer] 
"NoDriveTypeAutoRun"=hex:95,00,00,00(Win98)/91,00,00,00(WinXP)（允许自动） 
"NoDriveTypeAutoRun"=hex:b5,00,00,00（取消自动） 
[注1]WIN9X此项设置并不能关闭自动播放CD功能，若要单独禁止CD自动播放，可在注册表中做如下修改： 
[HKEY_CLASSES_ROOT\AudioCD\shell] 
[操作]删除"默认"值中的字符串"play"。 
[注2]在WIN9X下若要彻底关闭自动运行功能，可以在设备管理器光驱的属性设置里禁用"自动插入通告"，即插入和弹出光盘Windows都不会自动刷新，这项设置也可以在注册表中修改： 
[HKEY_LOCAL_MACHINE\Enum\SCSI\<光驱型号ID>\MF&CH...] 
"AutoInsertNotification"=hex:00 
WIN2000/XP可以进行如下设置达到相同功能： 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom] 
"Autorun"=dword:00000000 

《自动播放功能详释》 
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Expolrer] 
"NoDriveTypeAutoRun" 指定按设备类型禁止自动播放。1：未知类型，4：可移动磁盘，8：硬盘，10：网络驱动器，20：光驱，40：RAM驱动器，80：未知类型，FF：所有类型。若要禁止某一类型自动播放，直接使用对应的值，若要禁止几种类型，则使用它们数值相加的值，如95=1+4+10+80，91=1+10+80， b5=1+4+10+20+80。 
"NoDriveAutoRun"指定按盘符禁止自动播放。相关设置可以参考NoDrives值，最大值为hex:ff,ff,ff,03，禁止所有盘自动播放。 

《使用传统用户界面（Shell外壳）》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"ClassicShell"=dword:00000001 
[作用]WIN9X/2000：关闭任务栏的工具栏功能；从资源管理器中删除查看菜单中"按Web页"选项；关闭"文件夹选项"中的"Windows 桌面更新"；取消开始菜单中的收藏夹（WIN9X）；"关闭 Windows"对话框中多了"注销"。 
WINXP：禁用Active Desktop和Web视图；用户无法将系统配置成通过单击打开项目。 

《禁止使用Windows快捷键》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoWinKeys"=dword:00000001 
[注]此设置禁用了WIN+E、WIN+D、WIN+F、WIN+R等Windows快捷键。 

《退出时不保存某些设置》 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoSaveSettings"=dword:00000001 
[注]该设置使系统退出时不保存打开窗口的位置和大小，任务栏中工具栏的位置，但依然保存桌面图标位置、开始菜单排序等设置。 

《只运行许可的Windows应用程序》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"RestrictRun"=dword:00000001（禁止运行所有程序） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun] 
[操作]新建字符串值，名称可以任意，串值为能运行的应用程序，保证"regedit.exe"包含在列表中。 

《禁止使用注册表编辑器regedit.exe》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 
"DisableRegistryTools"=dword:00000001 

《禁用显示/密码控制面板》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 
"NoDispCPL"=dword:00000001（显示） 
"NoSecCPL"=dword:00000001（密码）（WIN9X） 

《隐藏显示属性中的页面》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 
"NoDispBackgroundPage"=dword:00000001（WIN9X/2000:背景 / WINXP:桌面） 
"NoDispScrSavPage"=dword:00000001（屏幕保护程序） 
"NoDispAppearancePage"=dword:00000001（WIN9X/2000:外观 / WINXP:外观,主题） 
"NoDispSettingsPage"=dword:00000001（WIN9X:效果,web,设置 / WIN2000/XP:设置） 

《隐藏密码属性中的页面》（WIN9X） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 
"NoPwdPage"=dword:00000001（更改密码） 
"NoProfilePage"=dword:00000001（用户配置文件，同时禁用用户控制面板） 
"NoAdminPage"=dword:00000001（远程管理） 
[注]要显示"远程管理"，需先安装"Microsoft网络上的文件与打印机共享"。 

《隐藏系统属性中的页面》（WIN9X） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 
"NoDevMgrPage"=dword:00000001（设备管理器） 
"NoConfigPage"=dword:00000001（硬件配置文件） 
"NoFileSysPage"=dword:00000001（文件系统） 
"NoVirtMemPage"=dword:00000001（虚拟内存） 

《网络设置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network] 
"NoNetSetup"=dword:00000001（禁用网络控制面板）（WIN9X） 
"NoNetSetupIDPage"=dword:00000001（隐藏网络中的标识页面）（WIN9X） 
"NoNetSetupSecurityPage"=dword:00000001（隐藏网络中访问控制页面）（WIN9X） 
"NoEntireNetwork"=dword:00000001（在网上邻居中不出现整个网络） 
"NoWorkgroupContents"=dword:00000001（在网上邻居中不出现工作组内容）（WIN9X） 
"NoFileSharingControl"=dword:00000001（禁止出现文件夹的共享菜单）（WIN9X） 
"NoPrintSharingControl"=dword:00000001（禁止出现打印机的共享菜单）（WIN9X） 

《活动桌面设置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ActiveDesktop]（HKLM） 
"NoHTMLWallPaper"=dword:00000001（只允许使用位图墙纸） 
"NoChangingWallpaper"=dword:00000001（禁止修改墙纸，但仍然能用ACDSee修改） 
"NoAddingComponents"=dword:00000001（禁止添加任何桌面项） 
"NoDeletingComponents"=dword:00000001（禁止删除任何桌面项） 
"NoCloseDragDropBands"=dword:00000001（禁止关闭和拖放全部工具栏）（WIN9X） 
"NoMovingBands"=dword:00000001（禁止改变全部工具栏的尺寸）（WIN9X） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 
"NoCloseDragDropBands"=dword:00000001（禁止关闭和拖放全部工具栏）（WIN2000/XP） 
"NoMovingBands"=dword:00000001（禁止改变全部工具栏的尺寸）（WIN2000/XP） 

《禁用MS-DOS》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp] 
"Disabled"=dword:00000001（禁止在Windows下使用MS-DOS方式及其它DOS程序）（WIN9X） 
"NoRealMode"=dword:00000001（禁止重新启动计算机并切换到MS-DOS方式）（WIN9X）（HKLM） 

《密码与共享设置》（WIN9X） 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network] 
"DisablePwdCaching"=dword:00000001（禁用密码缓存） 
[注]设置不能在控制面板的密码属性中更改密码，登陆时用户使用任何一个密码或不用密码就可以登陆。 
"MinPwdLen"=dword:0000000x（0≤x≤8）（设置Windows密码的最小长度） 
"AlphanumPwds"=dword:00000001（使Windows密码必须为数字和字母） 
"HideSharePwds"=dword:00000000（显示共享密码，而不是*号） 
[注]新建此键值将更改Windows默认设置，即使再把此键值删除也会显示共享密码，除非将此值设为1。 
"NoFileSharing"=dword:00000001（禁止文件共享） 
[注]设置此值后，若之前没有设置共享，则不允许再设置，若之前已设置共享，则不能共享文件夹。 

《Windows系统信息》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion] 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion]（WIN2000/XP） 
"RegisteredOwner"="ab"（注册的名称） 
"RegisteredOrganization"="ab"（注册的组织） 
"ProductId"="ab"（产品ID） 
"ProductKey"="ab"（安装Windows的序列号） 
"Version"="ab"（Windows版本，出现在"关于..."页面）（WIN9X） 
"SystemRoot"="C:\\WINDOWS"（Windows系统文件夹） 
"ProgramFilesDir"="C:\\Program Files"（程序文件夹） 
"CommonFilesDir"="C:\\Program Files\\Common Files"（通用文件夹） 

《启动即自动运行的程序》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]（仅运行一次） 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices] 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]（仅运行一次） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run]（WIN2000/XP） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run]（WIN2000/XP） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows]（WIN2000/XP） 
"load"="ab" 
"run"="ab" 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]（WIN2000/XP） 
"Userinit"="ab" 
[注1]对于上面的"load"，"run"和"Userinit"，若要指定运行多个程序，在中间加","即可。 
[注2]Run中的程序是WINDOWS初始化后才运行的,而RunService中的程序是在操作系统启动时就开始运行的，也就是说RunServices中的程序先于Run中的程序运行。 


《Windows安装信息》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup] 
"SourcePath"="ab"（Windows安装路径） 
"lastdrive"="z"（系统可用盘符）（WIN9X） 
"Installation Sources"=（系统程序安装路径的历史记录）（WIN2000/XP） 
"DriverCachePath"=（驱动缓存路径）（WIN2000/XP） 

《已注册的程序目录和文件》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths] 
[注1]在资源管理器中删除其中已定义的目录时，系统会出现提示："此次改动将影响部分已注册的程序"。 
[注 2]在WIN2000/ME/XP中HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx\OpenWithList和 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts \.xxx\OpenWithList的程序名均在上面的主键中定义。 

《软件卸载信息》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall] 
[注]有些在"Uninstall"列出的程序并未在"添加/删除程序"控制面板显示，原因是没有使用"DisplayName"字符串，不过仍然可以找到"QuietUninstallString"字符串，通过复制其值的内容，然后在"运行"对话框中粘贴来执行卸载。 

《字体名称和文件名对照》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Fonts]（WIN9X） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]（WIN2000/XP） 

《改变系统字体》（WIN9X） 
[HKEY_CURRENT_CONFIG\Display\Settings] 
"fonts.fon"="vgasys.fon"（默认） 

《所有时区》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Time Zones]（WIN9X） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones]（WIN2000/XP） 

《隐藏/显示"回收站"》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Desktop\NameSpace\{645FF040-5081-101B-9F08-00AA002F954E}] 
[操作]删除子键{645FF040-5081-101B-9F08-00AA002F954E}即隐藏，再新建即恢复。 

《在"我的电脑"中隐藏/显示"计划任务"、"拨号网络"和"Web文件夹"》（WIN9X） 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\MyComputer\NameSpace] 
{D6277990-4C6A-11CF-8D87-00AA0060F5BF}（计划任务） 
{992CFFA0-F557-101A-88EC-00DD010CCC48}（拨号网络） 
{BDEADF00-C265-11d0-BCED-00A0C90AB50F}（Web文件夹） 

《清理开始->查找菜单中的项目》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\FindExtensions\Static] 

《隐藏资源管理器"查看"菜单"按Web页(W)"选项》（WIN9X） 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ExtShellViews] 
删除子键{5984FFE0-28D4-11CF-AE66-08002B2E1262} 

《用户登录时弹出警告窗口》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon]（WIN9X） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]（WIN2000/XP） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system]（WIN2000/XP） 
"LegalNoticeCaption"="ab" 
"LegalNoticeText"="ab" 
[注]如果后面两个键同时设置，则只会显示"system"中的信息。 

《自动登录Windows》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon]（WIN9X） 
"AutoAdminLogon"="1" 
"DefaultUserName"="ab" 
"DefaultPassword"="ab" 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]（WINNT/2000/XP） 
"AutoAdminLogon"="1" 
"DefaultUserName"="ab" 
"DefaultPassword"="ab" 
"DefaultDomainName"="ab" 

《不显示上次登陆的用户名》 
[HKEY_LOCAL_MACHINE\Network\Logon]（WIN9X） 
"DontShowLastUser"=dword:00000001 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System]（WIN2000/XP） 
"DontDisplayLastUserName"=dword:00000001 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]（WINNT） 
"DontDisplayLastUserName"=dword:00000001 

《防止匿名用户登录（通过点击"取消"或者按"Esc"登录）》（WIN9X） 
[HKEY_LOCAL_MACHINE\Network\Logon] 
"MustBeValidated"=dword:00000001 
[注]如果没有进行Windows友好登录的多用户设置，则仅对选择登录NT域有效。 

《改变登录背景图案》 
[HKEY_USERS\.DEFAULT\Control Panel\Desktop] 
"Wallpaper"="ab"（ab为bmp图片文件） 
"Tilewallpaper"="0"（0为居中，1为平铺） 
[注]WINXP在此定义的是"欢迎使用"屏幕之前的背景图案。 

《改变登录背景颜色》 
[HKEY_USERS\.DEFAULT\Control Panel\Colors] 
"Background"="0 0 0"（黑色，RGB颜色值） 

《使用两个独立的Explorer进程》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer] 
"DesktopProcess"=dword:00000001 
[注]该设置使所有Explorer实例（如资源管理器）使用一个单独进程，桌面和工具栏也使用一个单独进程，这样如果其中一个进程出错就不会影响到另一个。 

《每个资源管理器窗口使用单独进程》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 
"SeparateProcess"=dword:00000001 

《每个IE窗口使用单独进程》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BrowseNewProcess] 
"BrowseNewProcess"="yes" 

《重要文件夹的名称和位置》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders] 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders] 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders] 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\User Shell Folders] 
[注]要改变文件夹的路径，必须在"User Shell Folders"子键下定义，可以添加缺少的项目。 

《清除"运行"、"查找"和"文档"中的历史记录》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU] 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Doc Find Spec MRU]（WIN9X） 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs] 

《菜单排序记录》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder] 

《系统程序安装路径的历史记录》 
[HKEY_CURRENT_USER\InstallLocationsMRU]（WIN9X） 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup]（WIN2000/XP） 
"Installation Sources"= 

《自定义资源管理器中的右键菜单》 
[HKEY_CLASSES_ROOT\Directory\shell]（文件夹） 
[HKEY_CLASSES_ROOT\Drive\shell]（驱动器） 
[HKEY_CLASSES_ROOT\Folder\shell]（文件夹和驱动器） 
[HKEY_CLASSES_ROOT\Winamp.File\shell]（文件：Winamp关联的文件类型） 
[操作]若要清除某个项目，直接删除其下对应的子键即可。若要增加某个项目，新建一个子键并将其命名，在其下再新建一个子键命名为command，在"默认"值里输入"程序名 %1"。 
[注1]若要在文件夹或驱动器右键菜单加入MS-DOS方式，使用命令"COMMAND.COM /K CD %1"。 
[注2]对于WIN9X，如果在HKEY_CLASSES_ROOT\.xxx中，将此文件类型的默认值数据置空或者指向一个不存在的键，则此文件类型右键菜单没有任何打开方式，双击也没有任何响应（reg文件除外）。 

《给所有文件类型的右键菜单添加关联项目》 
[HKEY_CLASSES_ROOT\*\shell]（关联任意程序） 
[操作]新建一个子键并将其命名，在其下再新建一个子键命名为command，在"默认"值里输入"程序名 %1"。 
[HKEY_CLASSES_ROOT\*\shell\打开方式\command]（增加"打开方式"选单） 
[操作]在"默认"值里输入"rundll32.exe shell32.dll,OpenAs_RunDLL %1"。 
[HKEY_CLASSES_ROOT\*\quickview]（增加"quick view"选单） 
[操作]在"默认"值里输入"*"。 

《缩减右键菜单的"新建"子菜单中的项目》 
[HKEY_CLASSES_ROOT\.rar\ShellNew]（WINRAR压缩文件新建菜单项） 
[操作]删除ShellNew主键，即可除去此新建菜单项。 

《删除右键菜单的"新建"项》 
[HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\New] 
[操作]删除"默认"的值"{D969A300-E7FF-11d0-A93B-00A0C90F2719}" 

《删除右键菜单的"发送到"项》 
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\Send To] 
[操作]删除"默认"的值"{7BA4C740-9E81-11CF-99D3-00AA004AE837}" 

《为文件及文件夹右键菜单添加"复制/移动到文件夹"选项》 
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers] 
[操作]添加"Copy To"和"Move To"子键，分别在其"默认"值中填入"{C2FBB630-2971-11D1-A18C-00C04FD75D13}"和"{C2FBB631-2971-11D1-A18C-00C04FD75D13}"。 

《改变"我的电脑"及其它所有文件夹的默认打开方式》 
[HKEY_CLASSES_ROOT\Folder\shell] 
[操作]修改它右边的"默认"值数据为"explore"或其它。 
[注]对于WIN9X，还可以在"文件夹选项"中设置，在"文件类型"找到第一个"文件夹"，修改其默认操作即可。 

《一些系统文件夹的类标识符（类ID）》 
[HKEY_CLASSES_ROOT\CLSID] 
我的电脑{20D04FE0-3AEA-1069-A2D8-08002B30309D} 
网上邻居{208D2C60-3AEA-1069-A2D7-08002B30309D} 
回收站{645FF040-5081-101B-9F08-00AA002F984E} 
我的文档{450D8FBA-AD25-11D0-98A8-0800361B1103} 
Internet Explorer{871C5380-42A0-1069-A2EA-08002B30309D} 
控制面板{21EC2020-3AEA-1069-A2DD-08002B30309D} 
拨号网络/网络连接{992CFFA0-F557-101A-88EC-00DD010CCC48} 
网络（和拨号）连接{7007ACC7-3202-11D1-AAD2-00805FC1270E}（WIN2000/XP） 
打印机/打印机和传真{2227A280-3AEA-1069-A2DE-08002B30309D} 
计划任务{D6277990-4C6A-11CF-8D87-00AA0060F5BF} 

《改变系统文件夹的名称》 
[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F984E}]（回收站） 
[HKEY_CLASSES_ROOT\CLSID\{21EC2020-3AEA-1069-A2DD-08002B30309D}]（控制面板） 
[HKEY_CLASSES_ROOT\CLSID\{992CFFA0-F557-101A-88EC-00DD010CCC48}]（拨号网络）（WIN9X） 
[HKEY_CLASSES_ROOT\CLSID\{2227A280-3AEA-1069-A2DE-08002B30309D}]（打印机）（WIN9X） 
[HKEY_CLASSES_ROOT\CLSID\{D6277990-4C6A-11CF-8D87-00AA0060F5BF}]（计划任务）（WIN9X） 
[操作]更改"默认"值的字符串。 
[注]除了回收站，该设置仅影响到资源管理器（我的电脑）中的系统文件夹。 

《改变系统文件夹和特殊文件夹图标》 
[HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\DefaultIcon]（Internet Explorer） 
[HKEY_CLASSES_ROOT\CLSID\{21EC2020-3AEA-1069-A2DD-08002B30309D}\DefaultIcon]（控制面板） 
[HKEY_CLASSES_ROOT\CLSID\{992CFFA0-F557-101A-88EC-00DD010CCC48}\DefaultIcon]（拨号网络）（WIN9X） 
[HKEY_CLASSES_ROOT\CLSID\{7007ACC7-3202-11D1-AAD2-00805FC1270E}\DefaultIcon]（网络连接）（WIN2000/XP） 
[HKEY_CLASSES_ROOT\CLSID\{2227A280-3AEA-1069-A2DE-08002B30309D}\DefaultIcon]（打印机/打印机和传真） 
[HKEY_CLASSES_ROOT\CLSID\{D6277990-4C6A-11CF-8D87-00AA0060F5BF}\DefaultIcon]（计划任务，%WinDir%\Task） 
[HKEY_CLASSES_ROOT\CLSID\{1A9BA3A0-143A-11CF-8350-444553540000}\DefaultIcon]（%WINDIR%\Favorites）（WIN9X） 
[HKEY_CLASSES_ROOT \CLSID\{FF393560-C2A7-11CF-BFF4-444553540000}\DefaultIcon]（WIN9X:%WINDIR %\History / WIN2000/XP:%USERPROFILE%\Local Settings\History） 
[HKEY_CLASSES_ROOT\CLSID\{88C6C381-2E85-11d0-94DE-444553540000}\DefaultIcon]（%WINDIR%\Downloaded Program Files） 
[操作]更改"默认"值中的图标文件及路径。 
[注] 如果在注册表[HKEY_CURRENT_USER\Software\Classes\CLSID]（WIN9X）或 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID] （WIN2000/XP）中定义了某系统文件夹的图标或名称，它的优先级将高于[HKEY_CLASSES_ROOT\CLSID]。桌面上的我的电脑、我的文档、网上邻居等图标和名称均在此定义。 

《在桌面系统级图标的右键菜单加入应用程序命令（以回收站为例）》 
[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell] 
[操作]新建一个子键并将其命名，在其下再新建一个子键命名为command，在"默认"值的数据里输入程序命令。 

《修改桌面系统级图标的提示信息》 
[HKEY_CLASSES_ROOT\CLSID] 
[操作]找到桌面图标所对应的类标识符，然后修改其中"InfoTip"值的数据即可。 

《更改"回收站"的右键菜单》 
[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder] 
"Attributes"=hex:40,01,00,20（默认） 
[操作]更改前两位数字即可改变其右键菜单，各数值及对应出现的菜单项为：01-复制，02-剪切，10-重命名，20-删除，40-属性。若要显示多个项目，可将其对应数值相加即可，如03-复制/减切，22-减切/删除，53-复制/剪切/重命名/属性，73-复制/剪切/重命名/删除/属性。 
[注]对于WIN9X/2000，以上所有数值都有效，但对于WINXP，仅将值设置为73有效。 

《将"回收站"降级为普通文件夹》（WIN9X） 
[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\InProcServer32] 
[操作]修改"默认"值的"shell32.dll"为其它或直接删除内容。 

《禁止使用reg/inf文件》 
[HKEY_CLASSES_ROOT\.reg] 
[操作]更改"默认"值数据为"txtfile"或其它任何字符，或者直接删除此键。 
[注]此项设置可以用其它方法解决，就是在reg文件右键菜单选择"打开方式"，然后选择"regedit"。 
[HKEY_CLASSES_ROOT\.inf] 
[操作]更改"默认"值数据为"txtfile"或其它任何字符，或者直接删除此键。 

《双击bat文件时编辑而不是执行》 
[HKEY_CLASSES_ROOT\batfile\shell] 
[操作]修改"默认"值中的字符串为"edit"。 

《缩略图显示bmp文件的图标》 
[HKEY_CLASSES_ROOT\.bmp] 
[操作]找到"默认"值的数据（例如ACDSee.BMP），再找到[HKEY_CLASSES_ROOT\ACDSee.BMP\DefaultIcon]，修改"默认"值中的字符串为"%1"。 

《移走快捷方式的小箭头》 
[HKEY_CLASSES_ROOT\lnkfile] 
[HKEY_CLASSES_ROOT\piffile] 
[操作]删除"IsShortcut" 
[注]若执行此项操作，则WIN98的收藏夹里不会出现非网页格式文档，如程序的快捷方式或文本文档。 

《禁止/允许添加"快捷方式"文字》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer] 
"Link"=hex:00,00,00,00（禁止）/19,00,00,00（允许） 


《输入法排序》 
[HKEY_CURRENT_USER\keyboard layout\preload] 
[操作]Win9X：重命名1，2，3......子键；WIN2000/XP：重命名1，2，3......键值。 
[注]某些WIN2000/XP系统的中文输入法默认是英文标点，这可能是Windows的bug，只要不把全拼输入法排到最前面就可以了。 

《语言及输入法的位置》 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts] 
[注]以0开头的键是语言，以E开头的键是输入法。 

《在输入的汉字后面加空格》 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\全拼] 
"插空格"=dword:00000001 

《在任务栏显示时间的位置显示文字》 
[HKEY_CURRENT_USER\Control Panel\International] 
"sTimeFormat"="ab"（可以是任意字符和时间格式） 
[例1]H:mm:ss（Windows默认，大写H表示以24小时格式显示时间） 
[例2]tt h:mm:ss（tt表示上午下午，小写h表示以12小时格式显示时间） 
[注] 对于WIN2000/XP，使用格式以外的任意字符没有效果，不过仍然可以让它显示文字，就是将"tt"定义的"上午""下午"字符改成其它，例如： "s1159"="上午好"，"s2359"="下午好"，"sTimeFormat"="tt"，或者"sTimeFormat"="tt H:mm:ss"。 

《允许/禁止PC在出错时发出声音》 
[HKEY_CURRENT_USER\Control Panel\Sound] 
"Beep"="yes"（允许）/"no"（禁止） 

《清理无用的Windows配色方案》 
[HKEY_CURRENT_USER\Control Panel\Appearance\Schemes] 

《解除屏幕保护密码》（WIN9X） 
[HKEY_CURRENT_USER\Control Panel\Desktop] 
[操作]删除"ScreenSave_Data" 

《禁止光标闪烁》 
[HKEY_CURRENT_USER\Control Panel\Desktop] 
"CursorBlinkRate"="-1" 

《改变菜单显示的速度》 
[HKEY_CURRENT_USER\Control Panel\Desktop] 
"MenuShowDelay"="400"（默认值，表示在菜单上停留400毫秒弹出下一级菜单，最快为0） 

《禁止WINDOWS平滑卷动》 
[HKEY_CURRENT_USER\Control Panel\Desktop] 
"SmoothScroll"=dword:00000000 

《关闭窗口动画效果》 
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics] 
"MinAnimate"="0" 

《改变Windows图标的显示》 
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics] 
"Shell Icon Size"="32"（大小：32×32像素） 
"Shell Icon BPP"="16"（色彩：16位增强色） 
"IconSpacing"="-1155"/"-1125"（水平间距） 
"IconVerticalSpacing"="-1125"（垂直间距） 

《改变图标缓存最大值》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer] 
"Max Cached Icons"="2000"（取值范围：100-4096） 

《改变Windows的Shell图标》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Icons] 
[操作]新建字符串值，名称从0开始，值为图标文件及路径。以下是各键值所对应的项目： 
0：未注册类型的文件 
2：不含图标的应用程序 
3：关闭的文件夹 
4：打开的文件夹 
6：3.5寸软盘驱动器 
7：可移动磁盘驱动器 
8：硬盘驱动器 
9：网络驱动器 
10：脱机网络驱动器 
11：光盘驱动器 
13：整个网络 
14：网络 
15：网上邻居中计算机图标 
16：本地打印机 
18：网络中的工作组 
19：开始菜单中的程序（WIN9X） 
20：开始菜单中的文档（WIN9X） 
21：开始菜单中的设置（WIN9X） 
22：开始菜单中的查找（WIN9X） 
23：开始菜单中的帮助（WIN9X） 
24：开始菜单中的运行（WIN9X） 
27：开始菜单中的关闭系统（WIN9X） 
28：共享覆盖图 
29：快捷方式覆盖图 
31：Recycled文件夹（空） 
32：Recycled文件夹（满） 
34：资源管理器中的桌面 
35：开始设置菜单中的控制面板 
36：开始程序菜单中的程序组 
37：开始设置菜单中的打印机 
39：开始设置菜单中的任务栏和开始菜单 
40：CD光盘 
43：开始菜单中的收藏夹（WIN9X） 
44：开始菜单中的注销（WIN9X） 
46：开始设置菜单中的Windows Update（WIN9X） 
48：开始查找菜单中的文件或文件夹（WIN9X） 
49：开始查找菜单中的计算机（WIN9X） 
53：添加打印机（WIN9X） 
54：网络打印机（WIN9X） 
55：文件打印机（WIN9X） 
75：联机本地打印机（WIN9X） 
76：联机网络打印机（WIN9X） 
77：联机文件打印机（WIN9X） 

《让WIN98使用多列开始菜单》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced] 
"StartMenuScrollPrograms"="False" 
[注]WIN98的开始菜单采用单列显示方式，当一列无法显示完全时，会在上下显示一个滚动点，把鼠标移到那里菜单就会滚动。而其它Windows系统都是采用多列显示方式，一次将整个菜单都在屏幕上显示出来，当超出时则放在第二列上。 

《禁止硬盘空间不足的警告》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem] 
"DisableLowDiskSpaceBroadcast"=04,00,00,00（C驱）/08,00,00,00（D驱）/10,00,00,00（E驱）/20,00,00,00（F驱）/hex:ff,ff,ff,ff（所有） 

《让计划任务提交错误报告》 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SchedulingAgent] 
"NotifyOnTaskMiss"=dword:00000001 
[注]当使用计划任务让系统自动运行一些命令或程序时，如果运行时发生错误，计划任务将不会提交错误报告，此设置就是让计划任务在出现错误时弹出提示信息。 

《增加驱动程序的识别级别》 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Driver Signing] 
"Policy"=hex:01,00,00,00（无注册标志时提示）或02,00,00,00（禁止） 

《自动清除内存中不被使用的DLL文件》 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AlwaysUnloadDLL] 
[操作]"默认"值设为"1" 

《增加USB端口检测间隔》 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Usb\0000]（WIN98/ME） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}\0000]（WIN2000/XP） 
"IdleEnable"=dword:00000001（0禁止检测间隔，1允许检测间隔） 
[注]如果有的话，对"0001"，"0002"......做相同设置。 

《更改CPU处理任务的默认优先级别》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\BIOS] 
"CPUPriority"=dword:0000000x（1：前台任务拥有最大优先级；2：前台任务的优先级高于后台任务；3：默认，前台与后台任务优先级相同；0：不推荐，前台任务实时运行） 

《总线及内存优化（减少等待周期）》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\BIOS] 
"PCIConcur"=dword:00000001 
"AGPConcur"=dword:00000001 
"FastDRAM"=dword:00000001 

《增加文件系统缓存》（WIN9X） 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\FS Templates\Desktop(/Mobile/Server)] 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem] 
"NameCache"=hex:a9,0a,00,00（Server默认） 
"PathCache"=hex:40,00,00,00（Server默认） 

《增加CD/DVD-ROM缓存》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem\CDFS] 
"CacheSize"=hex:6b,02,00,00（默认） 
"Prefetch"=hex:e4,00,00,00（默认） 

《优化文件系统》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem] 
"ConfigFileAllocSize"=dword:000001f4 

《提高软盘驱动器的读写速度（使之具备后台存储管理功能）》（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\fdc\0000] 
"ForeFifo"=dword:00000000 

《删除系统无用的动态链接库（DLL文件）》 
[HEKY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLL] 
[注]每个DLL文件的键值说明此DLL被几个应用程序共享，若为"01 00 00 00"则此DLL文件被一个应用程序共享。若为 "00 00 00 00"则该DLL文件对系统不起作用，说明它是一个^^文件，删除该键值，并且删除硬盘中的这个DLL文件。 

《查看系统中的16位和32位DLL文件》 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Known16DLLs]（16位）（WIN9X） 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\KnownDLLs]（32位） 

《Windows自动刷新/手动刷新》 
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Update] 
"UpdateMode"=hex:00,00,00,00（自动刷新）/01,00,00,00（手动刷新） 
 
]]></description>
<pubDate>
2006-11-25 10:32:00.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791335.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791335.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[二十年遇到八句话 [转]]]></title>
<link>
http://plikefly.blogcn.com/diary,103791405.shtml</link>
<description>
<![CDATA[人的一生总会遇到一些话，它们突如其来，在不经意间打动了你，然后改变了你的一生。在遇到它们之前，你活得不明不白，如在暗夜独行，一旦遭遇，你就如遇导路的知音，终生活在这些话里。
在过去的二十年里，下面这些话，便如此深刻地塑造了我的人生。
 
[b]“你必须有一份不以此为生的职业。”[/b]
有人在定义“知识分子”时，设定了这一准则，我幸运地在大学四年级的时候读到了它。它的意思非常之明确：一位知识分子要保持独立的思考精神和发言姿态，便必须在经济上首先实现独立。这句话是如此的让我刻骨铭心，以至于影响了我之后的所有职业态度和生活选择。
 
[b]“你是三十岁以下最著名的美国男士。”[/b]
这句话是美国总统罗斯福对26岁的《新共和》编辑沃尔特·李普曼说的。我是大学时期在翻《李普曼传》时读到的，也许没有一个新闻从业者不以他为职业的偶像。于是，这个场景成为我走向职业场时最大的梦想。与此相关的另一句更耳熟的话则是张爱玲说的，“出名要趁早，迟了快乐也会少一点。”
 
[b]“一切改革都是从违法开始的。”[/b]
我在走遍了中国26个省份之后，仍然对这个国家正发生的一切懵懂不解，直到有一个傍晚，我跟创办了第一个中国农民城却又被官方人士不断“追杀”的温州龙港镇镇长陈定模在一间街边小铺上喝酒时，他冲口说出的这句话，让我酩酊开窍。从此之后直到今日，我考察中国改革史，无一不是从这句话开始，而我竟还发现，当今所有的社会后遗症和原罪也无一不与此相关。
 
[b]“生命就应该浪费在美好的事物上。”[/b]
这是台湾黑松汽水的一句广告词，在听到它之前我一直被职业和工作所驱赶，我不知道生活的快乐半径到底有多大，什么是有意义的，什么则是无效的，我想，这种焦虑一定缠绕过所有试图追问生命价值的青年人。是这句广告词突然间让我明白了一切，生命从头到尾都是一场浪费，你需要判断的仅仅在于，这次浪费是否是“美好”的。当我每做一件事情的时候，我便问自己，你认为它是美好的吗？如果是，那就去做吧。
 
[b]“如果99％的经济学论文没有发表，世界照样会发展成现在这个样子。”[/b]
张五常的这句话让我放下了对职业的无妄执着。在此之前，我对自己的工作充满了莫名和不着边际的使命感，总以为天下的变革都是从这些思想开始的，张五常的话让我突然明白，历史其实有它自己的逻辑和轨迹，我们所能为的，无非是论证它的慈悲与邪恶。当那些文字从我们的头脑中释放出来的时候，我们便已经尽职，它的机遇与事实的结局已经与我们无关。
 
[b]“再穷，也要站在富人堆里。”[/b]
    记不得是不是写《穷爸爸富爸爸》的罗伯特·清崎说的，反正这句话的出现最终改变了我的个人理财观。尽管我对富人从来没有任何好感，但是我还是要承认，这个世界上绝大多数的进步都是他们创造的。你去全世界看遗留下来的文明遗迹，没有一个不与财富和权力有关。我所希望自己的是，站在富人堆里，但永远怀着廉耻之心。
 
[b]“好朋友，见一面，少一面。”[/b]
这是一句大实话，乍听上去很难听，但是一细想却是一条真理。吃饭的时候，我就想“吃一顿，少一顿”，快乐的时候，我就想“这样的快乐有一场，就少一场了”。西方人说，“珍惜当下”，中国古人说，“人生苦短，秉烛夜游”，说来说去其实都是一个道理。当我在三十岁那年听到并甚为认同这句话的时候，其实便是皈依了一种生命观。
 
 
[b]“我最大的错误，是没有化光所有的钱。”[/b]
    写出《 城南旧事 》的林海音一生当编辑、做刊物、办出版社，然后把赚来的钱换成了二十多套房子。到65岁，她突然宣布关掉出版社云游四海，每过几年钱化光了，她就卖掉一套房子，到82岁去世时，竟还有数套房子没有买光，于是留下上述遗言。我读到这段轶事时，竟非常感慨。我喜欢的作者沈从文去世时，弟子问他，还有什么遗言。这位毕生倔强的湘西人说，“对这个世界，我已无话可说。”相比沈老头和林老太，我更羡慕早年的前者和晚年的后者。
]]></description>
<pubDate>
2006-11-24 16:51:21.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791405.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791405.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[3135500]]></blogcn_uid>
<title>
<![CDATA[setjmp和longjmp]]></title>
<link>
http://plikefly.blogcn.com/diary,103791463.shtml</link>
<description>
<![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
<TBODY>
<TR>
<TD class=title vAlign=bottom height=40>
<DIV align=center>第16集 C语言中一种更优雅的异常处理机制 
<HR width="80%" noShade SIZE=1>
</DIV></TD></TR>
<TR>
<TD class=hui vAlign=top height=20>
<DIV class=hui24 align=center>作者：王胜祥　来源：希赛网　<FONT color=#ff0000>http://www.csai.cn</FONT>　2005年5月19日</DIV></TD></TR>
<TR>
<TD class=matter vAlign=top>
<P>　　上一篇文章对C语言中的goto语句进行了较深入的阐述，实际上goto语句是面向过程与面向结构化程序语言中，进行异常处理编程的最原始的支持形 式。后来为了更好地、更方便地支持异常处理编程机制，使得程序员在C语言开发的程序中，能写出更高效、更友善的带有异常处理机制的代码模块来。于是，C语 言中出现了一种更优雅的异常处理机制，那就是setjmp()函数与longjmp()函数。<BR><BR>　　实际上，这种异常处理的机制不是C语言中自身的一部分，而是在C标准库中实现的两个非常有技巧的库函数，也许大多数C程序员朋友们对它都很熟悉，而 且，通过使用setjmp()函数与longjmp()函数组合后，而提供的对程序的异常处理机制，以被广泛运用到许多C语言开发的库系统中，如jpg解 析库，加密解密库等等。<BR><BR>　　也许C语言中的这种异常处理机制，较goto语句相比较，它才是真正意义上的、概念上比较彻底的，一种异常处理机制。作风一向比较严谨、喜欢刨根问底的主人公阿愚当然不会放<BR>弃对这种异常处理机制进行全面而深入的研究。下面一起来看看。<BR><STRONG><BR>setjmp函数有何作用？</STRONG><BR><BR>　　前面刚说了，setjmp是C标准库中提供的一个函数，它的作用是保存程序当前运行的一些状态。它的函数原型如下：</P>
<P>int setjmp( jmp_buf env );</P>
<P>　　这是MSDN中对它的评论，如下：</P>
<P>　　setjmp函数用于保存程序的运行时的堆栈环境，接下来的其它地方，你可以通过调用longjmp函数来恢复先前被保存的程序堆栈环境。当setjmp和longjmp组合一起使用时，它们能提供一种在程序中实现“非本地局部跳转”（"non-local goto"）的机制。并且这种机制常常被用于来实现，把程序的控制流传递到错误处理模块之中；或者程序中不采用正常的返回（return）语句，或函数的正常调用等方法，而使程序能被恢复到先前的一个调用例程（也即函数）中。</P>
<P>　 　对setjmp函数的调用时，会保存程序当前的堆栈环境到env参数中；接下来调用longjmp时，会根据这个曾经保存的变量来恢复先前的环境，并且 当前的程序控制流，会因此而返回到先前调用setjmp时的程序执行点。此时，在接下来的控制流的例程中，所能访问的所有的变量（除寄存器类型的变量以 外），包含了longjmp函数调用时，所拥有的变量。</P>
<P>　　setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中，请使用C++提供的异常处理机制。</P>
<P>　　好了，现在已经对setjmp有了很感性的了解，暂且不做过多评论，接着往下看longjmp函数。<BR><BR><STRONG>longjmp函数有何作用？</STRONG><BR><BR>　　同样，longjmp也是C标准库中提供的一个函数，它的作用是用于恢复程序执行的堆栈环境，它的函数原型如下：</P>
<P>void longjmp( jmp_buf env, int value );</P>
<P>　　这是MSDN中对它的评论，如下：</P>
<P>　　longjmp函数用于恢复先前程序中调用的setjmp函数时所保存的堆栈环境。setjmp和longjmp组合一起使用时，它们能提供一种在程序中实现“非本地局部跳转”（"non-local goto"）的机制。并且这种机制常常被用于来实现，把程序的控制流传递到错误处理模块，或者不采用正常的返回（return）语句，或函数的正常调用等方法，使程序能被恢复到先前的一个调用例程（也即函数）中。</P>
<P>　 　对setjmp函数的调用时，会保存程序当前的堆栈环境到env参数中；接下来调用longjmp时，会根据这个曾经保存的变量来恢复先前的环境，并且 因此当前的程序控制流，会返回到先前调用setjmp时的执行点。此时，value参数值会被setjmp函数所返回，程序继续得以执行。并且，在接下来 的控制流的例程中，它所能够访问到的所有的变量（除寄存器类型的变量以外），包含了longjmp函数调用时，所拥有的变量；而寄存器类型的变量将不可预 料。setjmp函数返回的值必须是非零值，如果longjmp传送的value参数值为0，那么实际上被setjmp返回的值是1。</P>
<P>　　在调用setjmp的函数返回之前，调用longjmp，否则结果不可预料。</P>
<P>　　在使用longjmp时，请遵守以下规则或限制：<BR>　　· 不要假象寄存器类型的变量将总会保持不变。在调用longjmp之后，通过setjmp所返回的控制流中，例程中寄存器类型的变量将不会被恢复。<BR>　　· 不要使用longjmp函数，来实现把控制流，从一个中断处理例程中传出，除非被捕获的异常是一个浮点数异常。在后一种情况下，如果程序通过调用 _fpreset函数，来首先初始化浮点数包后，它是可以通过longjmp来实现从中断处理例程中返回。<BR>　　· 在C++程序中，小心对setjmp和longjmp的使用，应为setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中，使用C++提供的异常处理机制将会更加安全。<BR>把setjmp和longjmp组合起来，原来它这么厉害！<BR>　　现在已经对setjmp和longjmp都有了很感性的了解，接下来，看一个示例，并从这个示例展开分析，示例代码如下（来源于MSDN）：</P>
<P>/* FPRESET.C: This program uses signal to set up a<BR>* routine for handling floating-point errors.<BR>*/</P>
<P>#include &lt;stdio.h&gt;<BR>#include &lt;signal.h&gt;<BR>#include &lt;setjmp.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include &lt;float.h&gt;<BR>#include &lt;math.h&gt;<BR>#include &lt;string.h&gt;</P>
<P>jmp_buf mark; /* Address for long jump to jump to */<BR>int fperr; /* Global error number */</P>
<P>void __cdecl fphandler( int sig, int num ); /* Prototypes */<BR>void fpcheck( void );</P>
<P>void main( void )<BR>{<BR>double n1, n2, r;<BR>int jmpret;<BR>/* Unmask all floating-point exceptions. */<BR>_control87( 0, _MCW_EM );<BR>/* Set up floating-point error handler. The compiler<BR>* will generate a warning because it expects<BR>* signal-handling functions to take only one argument.<BR>*/<BR>if( signal( SIGFPE, fphandler ) == SIG_ERR )</P>
<P>{<BR>fprintf( stderr, "Couldn't set SIGFPE\n" );<BR>abort(); }</P>
<P>/* Save stack environment for return in case of error. First <BR>* time through, jmpret is 0, so true conditional is executed. <BR>* If an error occurs, jmpret will be set to -1 and false <BR>* conditional will be executed.<BR>*/ </P>
<P>// 注意，下面这条语句的作用是，保存程序当前运行的状态<BR>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>printf( "Test for invalid operation - " );<BR>printf( "enter two numbers: " );<BR>scanf( "%lf %lf", &amp;n1, &amp;n2 );</P>
<P>// 注意，下面这条语句可能出现异常，<BR>// 如果从终端输入的第2个变量是0值的话<BR>r = n1 / n2;<BR>/* This won't be reached if error occurs. */<BR>printf( "\n\n%4.3g / %4.3g = %4.3g\n", n1, n2, r );</P>
<P>r = n1 * n2;<BR>/* This won't be reached if error occurs. */<BR>printf( "\n\n%4.3g * %4.3g = %4.3g\n", n1, n2, r );<BR>}<BR>else<BR>fpcheck();<BR>}<BR>/* fphandler handles SIGFPE (floating-point error) interrupt. Note<BR>* that this prototype accepts two arguments and that the <BR>* prototype for signal in the run-time library expects a signal <BR>* handler to have only one argument.<BR>*<BR>* The second argument in this signal handler allows processing of<BR>* _FPE_INVALID, _FPE_OVERFLOW, _FPE_UNDERFLOW, and <BR>* _FPE_ZERODIVIDE, all of which are Microsoft-specific symbols <BR>* that augment the information provided by SIGFPE. The compiler <BR>* will generate a warning, which is harmless and expected.</P>
<P>*/<BR>void fphandler( int sig, int num )<BR>{<BR>/* Set global for outside check since we don't want<BR>* to do I/O in the handler.<BR>*/<BR>fperr = num;<BR>/* Initialize floating-point package. */<BR>_fpreset();<BR>/* Restore calling environment and jump back to setjmp. Return <BR>* -1 so that setjmp will return false for conditional test.<BR>*/<BR>// 注意，下面这条语句的作用是，恢复先前setjmp所保存的程序状态<BR>longjmp( mark, -1 );<BR>}<BR>void fpcheck( void )<BR>{<BR>char fpstr[30];<BR>switch( fperr )<BR>{<BR>case _FPE_INVALID:<BR>strcpy( fpstr, "Invalid number" );<BR>break;<BR>case _FPE_OVERFLOW:<BR>strcpy( fpstr, "Overflow" );</P>
<P>break;<BR>case _FPE_UNDERFLOW:<BR>strcpy( fpstr, "Underflow" );<BR>break;<BR>case _FPE_ZERODIVIDE:<BR>strcpy( fpstr, "Divide by zero" );<BR>break;<BR>default:<BR>strcpy( fpstr, "Other floating point error" );<BR>break;<BR>}<BR>printf( "Error %d: %s\n", fperr, fpstr );<BR>}</P>
<P>程序的运行结果如下：<BR>Test for invalid operation - enter two numbers: 1 2</P>
<P><BR>1 / 2 = 0.5</P>
<P><BR>1 * 2 = 2</P>
<P>　　上面的程序运行结果正常。另外程序的运行结果还有一种情况，如下：<BR>Test for invalid operation - enter two numbers: 1 0<BR>Error 131: Divide by zero</P>
<P>　　呵呵！程序运行过程中出现了异常（被0除），并且这种异常被程序预先定义的异常处理模块所捕获了。厉害吧！可千万别轻视，这可以C语言编写的程序。<BR><BR><STRONG>分析setjmp和longjmp</STRONG><BR><BR>　　现在，来分析上面的程序的执行过程。当然，这里主要分析在异常出现的情况下，程序运行的控制转移流程。由于文章篇幅有限，分析时，我们简化不相关的代码，这样更也易理解控制流的执行过程。如下图所示。</P>
<P align=center><IMG height=480 alt="" src="http://51cmm.csai.cn/ExpertEyes/Images/no152.gif" width=554></P>
<P>　　呵呵！现在是否对程序的执行流程一目了然，其中最关键的就是setjjmp和longjmp函数的调用处理。我们分别来分析之。<BR><BR>　　当程序运行到第②步时，调用setjmp函数，这个函数会保存程序当前运行的一些状态信息，主要是一些系统寄存器的值，如ss，cs，eip， eax，ebx，ecx，edx，eflags等寄存器，其中尤其重要的是eip的值，因为它相当于保存了一个程序运行的执行点。这些信息被保存到 mark变量中，这是一个C标准库中所定义的特殊结构体类型的变量。<BR><BR>　　调用setjmp函数保存程序状态之后，该函数返回0值，于是接下来程序执行到第③步和第④步中。在第④步中语句执行时，如果变量n2为0值，于是便 引发了一个浮点数计算异常，，导致控制流转入fphandler函数中，也即进入到第⑤步。<BR><BR>　　然后运行到第⑥步，调用longjmp函数，这个函数内部会从先前的setjmp所保存的程序状态，也即mark变量中，来恢复到以前的系统寄存器的 值。于是便进入到了第⑦步，注意，这非常有点意思，实际上，通过longjmp函数的调用后，程序控制流（尤其是eip的值）再次戏剧性地进入到了 setjmp函数的处理内部中，但是这一次setjmp返回的值是longjmp函数调用时，所传入的第2个参数，也即-1，因此程序接下来进入到了第⑧ 步的执行之中。<BR><BR><STRONG>总结</STRONG><BR><BR>　　与goto语句不同，在C语言中，setjmp()与longjmp()的组合调用，为程序员提供了一种更优雅的异常处理机制。它具有如下特点：<BR><BR>　　 （1） goto只能实现本地跳转，而setjmp()与longjmp()的组合运用，能有效的实现程序控制流的非本地（远程）跳转；<BR><BR>　　 （2） 与goto语句不同，setjmp()与longjmp()的组合运用，提供了真正意义上的异常处理机制。例如，它能有效定义受监控保护的模块区域（类似 于C++中try关键字所定义的区域）；同时它也能有效地定义异常处理模块（类似于C++中catch关键字所定义的区域）；还有，它能在程序执行过程 中，通过longjmp函数的调用，方便地抛出异常（类似于C++中throw关键字）。</P>
<P>　　现在，相信大家已经对在C语言中提供的这种异常处理机制有了很全面地了解。但是我们还没有深入它研究它，下一篇文章中继续探讨吧！go！</P></TD></TR></TBODY></TABLE><BR><!---->
<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
<TBODY>
<TR>
<TD class=title vAlign=bottom height=40>
<DIV align=center>全面了解setjmp与longjmp的使用 
<HR width="80%" noShade SIZE=1>
</DIV></TD></TR>
<TR>
<TD class=hui vAlign=top height=20>
<DIV class=hui24 align=center>作者：王胜祥　来源：希赛网　<FONT color=#ff0000>http://www.csai.cn</FONT>　2005年5月21日</DIV></TD></TR>
<TR>
<TD class=matter vAlign=top>　 　上一篇文章对setjmp函数与longjmp函数有了较全面的了解，尤其是这两个函数的作用，函数所完成的功能，以及将setjmp函数与 longjmp函数组合起来，实现异常处理机制时，程序模块控制流的执行过程等。这里更深入一步，将对setjmp与longjmp的具体使用方法和适用 的场合，进行一个非常全面的阐述。<BR><BR>　　另外请特别注意，setjmp函数与longjmp函数总是组合起来使用，它们是紧密相关的一对操作，只有将它们结合起来使用，才能达到程序控制流有效转移的目的，才能按照程序员的预先设计的意图，去实现对程序中可能出现的异常进行集中处理。<BR><BR>　　与goto语句的作用类似，它能实现本地的跳转<BR><BR>　　这种情况容易理解，不过还是列举出一个示例程序吧！如下： 
<P>void main( void )<BR>{<BR>int jmpret;</P>
<P>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(1) longjmp(mark, 1);</P>
<P>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(2) longjmp(mark, 2);</P>
<P>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(-1) longjmp(mark, -1);</P>
<P>// 其它代码的执行<BR>}<BR>else<BR>{<BR>// 错误处理模块<BR>switch (jmpret)<BR>{<BR>case 1:<BR>printf( "Error 1\n");<BR>break;<BR>case 2:<BR>printf( "Error 2\n");<BR>break;<BR>case 3:<BR>printf( "Error 3\n");<BR>break;<BR>default :<BR>printf( "Unknown Error");<BR>break;<BR>}<BR>exit(0);<BR>}</P>
<P>return;<BR>}</P>
<P>　 　上面的例程非常地简单，其中程序中使用到了异常处理的机制，这使得程序的代码非常紧凑、清晰，易于理解。在程序运行过程中，当异常情况出现后，控制流是 进行了一个本地跳转（进入到异常处理的代码模块，是在同一个函数的内部），这种情况其实也可以用goto语句来予以很好的实现，但是，显然setjmp与 longjmp的方式，更为严谨一些，也更为友善。程序的执行流如图17-1所示。</P>
<P align=center><IMG height=636 alt="" src="http://51cmm.csai.cn/ExpertEyes/Images/no153.gif" width=471></P>
<P><BR><BR><STRONG>setjmp与longjmp相结合，实现程序的非本地的跳转</STRONG><BR><BR>　　呵呵！这就是goto语句所不能实现的。也正因为如此，所以才说在C语言中，setjmp与longjmp相结合的方式，它提供了真正意义上的异常处 理机制。其实上一篇文章中的那个例程，已经演示了longjmp函数的非本地跳转的场景。这里为了更清晰演示本地跳转与非本地跳转，这两者之间的区别，我 们在上面刚才的那个例程基础上，进行很小的一点改动，代码如下：</P>
<P>void Func1()<BR>{<BR>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(1) longjmp(mark, 1);<BR>}</P>
<P>void Func2()<BR>{<BR>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(2) longjmp(mark, 2);<BR>}</P>
<P>void Func3()<BR>{<BR>// 其它代码的执行<BR>// 判断程序远行中，是否出现错误，如果有错误，则跳转！<BR>if(-1) longjmp(mark, -1);<BR>}</P>
<P>void main( void )<BR>{<BR>int jmpret;</P>
<P>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>// 其它代码的执行</P>
<P>// 下面的这些函数执行过程中，有可能出现异常<BR>Func1();</P>
<P>Func2();</P>
<P>Func3();</P>
<P>// 其它代码的执行<BR>}<BR>else<BR>{<BR>// 错误处理模块<BR>switch (jmpret)<BR>{<BR>case 1:<BR>printf( "Error 1\n");<BR>break;<BR>case 2:<BR>printf( "Error 2\n");<BR>break;<BR>case 3:<BR>printf( "Error 3\n");<BR>break;<BR>default :<BR>printf( "Unknown Error");<BR>break;<BR>}<BR>exit(0);<BR>}</P>
<P>return;<BR>}<BR><BR>　　回顾一下，这与C++中提供的异常处理模型是不是很相近。异常的传递是可以跨越一个或多个函数。这的确为C程序员提供了一种较完善的异常处理编程的机制或手段。<BR><BR><STRONG>setjmp和longjmp使用时，需要特别注意的事情</STRONG><BR><BR>　　1、setjmp与longjmp结合使用时，它们必须有严格的先后执行顺序，也即先调用setjmp函数，之后再调用longjmp函数，以恢复到 先前被保存的“程序执行点”。否则，如果在setjmp调用之前，执行longjmp函数，将导致程序的执行流变的不可预测，很容易导致程序崩溃而退出。 请看示例程序，代码如下：</P>
<P>class Test<BR>{<BR>public:<BR>Test() {printf("构造对象\n");}<BR>~Test() {printf("析构对象\n");}<BR>}obj; </P>
<P>//注意，上面声明了一个全局变量obj</P>
<P>void main( void )<BR>{<BR>int jmpret;</P>
<P>// 注意，这里将会导致程序崩溃，无条件退出<BR>Func1();<BR>while(1);</P>
<P>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>// 其它代码的执行</P>
<P>// 下面的这些函数执行过程中，有可能出现异常<BR>Func1();</P>
<P>Func2();</P>
<P>Func3();</P>
<P>// 其它代码的执行<BR>}<BR>else<BR>{<BR>// 错误处理模块<BR>switch (jmpret)<BR>{<BR>case 1:<BR>printf( "Error 1\n");<BR>break;<BR>case 2:<BR>printf( "Error 2\n");<BR>break;<BR>case 3:<BR>printf( "Error 3\n");<BR>break;<BR>default :<BR>printf( "Unknown Error");<BR>break;<BR>}<BR>exit(0);<BR>}</P>
<P>return;<BR>}</P>
<P>　　上面的程序运行结果，如下：<BR>　　构造对象<BR>　　Press any key to continue</P>
<P>　 　的确，上面程序崩溃了，由于在Func1()函数内，调用了longjmp，但此时程序还没有调用setjmp来保存一个程序执行点。因此，程序的执行 流变的不可预测。这样导致的程序后果是非常严重的，例如说，上面的程序中，有一个对象被构造了，但程序崩溃退出时，它的析构函数并没有被系统来调用，得以 清除一些必要的资源。所以这样的程序是非常危险的。（另外请注意，上面的程序是一个C++程序，所以大家演示并测试这个例程时，把源文件的扩展名改为 xxx.cpp）。</P>
<P>　　2、除了要求先调用setjmp函数，之后再调用longjmp函数（也即longjmp必须有对应的setjmp函数）之外。另外，还有一个很重要的规则，那就是longjmp的调用是有一定域范围要求的。这未免太抽象了，还是先看一个示例，如下：</P>
<P>int Sub_Func()<BR>{<BR>int jmpret, be_modify;<BR><BR>be_modify = 0;</P>
<P>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>// 其它代码的执行<BR>}<BR>else<BR>{<BR>// 错误处理模块<BR>switch (jmpret)<BR>{<BR>case 1:<BR>printf( "Error 1\n");<BR>break;<BR>case 2:<BR>printf( "Error 2\n");<BR>break;<BR>case 3:<BR>printf( "Error 3\n");<BR>break;<BR>default :<BR>printf( "Unknown Error");<BR>break;<BR>}</P>
<P>//注意这一语句，程序有条件地退出<BR>if (be_modify==0) exit(0);<BR>}</P>
<P>return jmpret;<BR>}</P>
<P>void main( void )<BR>{<BR>Sub_Func();</P>
<P>// 注意，虽然longjmp的调用是在setjmp之后，但是它超出了setjmp的作用范围。<BR>longjmp(mark, 1);<BR>}</P>
<P>　　如果你运行或调试（单步跟踪）一下上面程序，发现它真是挺神奇的，居然longjmp执行时，程序还能够返回到setjmp的执行点，程序正常退出。但是这就说明了上面的这个例程的没有问题吗？我们对这个程序小改一下，如下：</P>
<P>int Sub_Func()<BR>{<BR>// 注意，这里改动了一点<BR>int be_modify, jmpret;<BR><BR>be_modify = 0;</P>
<P>jmpret = setjmp( mark );<BR>if( jmpret == 0 )<BR>{<BR>// 其它代码的执行<BR>}<BR>else<BR>{<BR>// 错误处理模块<BR>switch (jmpret)<BR>{<BR>case 1:<BR>printf( "Error 1\n");<BR>break;<BR>case 2:<BR>printf( "Error 2\n");<BR>break;<BR>case 3:<BR>printf( "Error 3\n");<BR>break;<BR>default :<BR>printf( "Unknown Error");<BR>break;<BR>}</P>
<P>//注意这一语句，程序有条件地退出<BR>if (be_modify==0) exit(0);<BR>}</P>
<P>return jmpret;<BR>}</P>
<P>void main( void )<BR>{<BR>Sub_Func();</P>
<P>// 注意，虽然longjmp的调用是在setjmp之后，但是它超出了setjmp的作用范围。<BR>longjmp(mark, 1);<BR>}</P>
<P>　 　运行或调试（单步跟踪）上面的程序，发现它崩溃了，为什么？这就是因为，“在调用setjmp的函数返回之前，调用longjmp，否则结果不可预料” （这在上一篇文章中已经提到过，MSDN中做了特别的说明）。为什么这样做会导致不可预料？其实仔细想想，原因也很简单，那就是因为，当setjmp函数 调用时，它保存的程序执行点环境，只应该在当前的函数作用域以内（或以后）才会有效。如果函数返回到了上层（或更上层）的函数环境中，那么setjmp保 存的程序的环境也将会无效，因为堆栈中的数据此时将可能发生覆盖，所以当然会导致不可预料的执行后果。</P>
<P>　　 3、不要假象寄存器类型的变量将总会保持不变。在调用longjmp之后，通过setjmp所返回的控制流中，例程中寄存器类型的变量将不会被恢复。 （MSDN中做了特别的说明，上一篇文章中，这也已经提到过）。寄存器类型的变量，是指为了提高程序的运行效率，变量不被保存在内存中，而是直接被保存在 寄存器中。寄存器类型的变量一般都是临时变量，在C语言中，通过register定义，或直接嵌入汇编代码的程序。这种类型的变量一般很少采用，所以在使 用setjmp和longjmp时，基本上不用考虑到这一点。</P>
<P>　　4、MSDN中还做了特别的说明，“在C+ +程序中，小心对setjmp和longjmp的使用，因为setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中， 使用C++提供的异常处理机制将会更加安全。”虽然说C++能非常好的兼容C，但是这并非是100%的完全兼容。例如，这里就是一个很好的例子，在C++ 程序中，它不能很好地与setjmp和longjmp和平共处。在后面的一些文章中，有关专门讨论C++如何兼容支持C语言中的异常处理机制时，会做详细 深入的研究，这里暂且跳过。<BR><BR><STRONG>总结</STRONG><BR><BR>　　主人公阿愚现在对setjmp与longjmp已经是非常钦佩了，虽然它没有C++中提供的异常处理模型那么好用，但是毕竟在C语言中，有这么好用的 东东，已经是非常不错了。为了更上一层楼，使setjmp与longjmp更接近C++中提供的异常处理模型（也即try()catch()语法）。阿愚 找到了不少非常有价值的资料。不要错过，继续到下一篇文章中去吧！让程序员朋友们“玩转setjmp与longjmp”，Let’s go！</P></TD></TR></TBODY></TABLE><BR><!----><BR><!----><FONT size=4>例如：<BR><!----></FONT><A href="http://www.avrw.com/article/art_104_884.htm"><FONT size=4>setjmp构建简单协作式多任务系统</FONT></A><BR><!----><FONT size=4><A href="http://www.cnscn.org/showthread.php?t=879">setjmp保存目前堆栈环境</A></FONT>]]></description>
<pubDate>
2006-11-08 00:05:04.0</pubDate>
<guid>
http://plikefly.blogcn.com/diary,103791463.shtml</guid>
<comments>
http://plikefly.blogcn.com/diary,103791463.shtml#comment</comments>
</item>
</channel>
</rss>