2009年10月

在Unicode版Inno Setup中使用ISSkin给安装程序添加皮肤

最新的ISSkin为3.0,官方已经添加了对Unicode版Inno的支持!

ISSkin是Code jock 公司出品的Inno Setup 皮肤插件,用于为Inno制作的安装程序提供皮肤功能。

自Delphi发布2009之后,Inno Setup 开始出现支持Unicode编码的版本,即5.3.x系列,并且官方同时提供Ansi和Unicode版本。

如果了解Delphi 2009的朋友,应该就很了解这一版本对Unicode的支持,这里不多做介绍了。

Unicode版的Inno Setup脚本中会将所有字符串存储为Unicode字符串,使用双字节编码,包括ASCII码,如果调用为早期Ansi版开发的插件的话,涉及到字符串String,应该显式修改为AnsiString,这样才能保证Unicode字符串正确转换为Ansi字符串。

这里要解决由此而导致的问题。

现在的ISSkin最新版本是2.0.0,字符串使用Ansi编码,所以需要将官方主页上介绍的Code代码段进行修改。

这里介绍使用ISSkin对Unicode版的Inno Setup制作的安装程序添加皮肤。

第一步,在File段添加插件ISSkin的动态链接库ISSkin.dll和皮肤文件

例如:

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: Office2007.cjstyles; DestDir: {tmp}; Flags: dontcopy

第二步,在Code段声明API,注意这里将原String修改为AnsiString

例如:

[Code]
procedure LoadSkin(lpszPath: AnsiString; lpszIniFileName: AnsiString);external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin();external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

第三步,重载InitializeSetup和DeinitializeSetup两个函数以调用ISSkin插件功能

例如:

procedure DeinitializeSetup();
begin
    ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
    UnloadSkin();
end;

好了,现在截个图吧,看看效果。

1.png

(转)一说如果心就疼了

  直到大三那年,他还没见哪个男生是她身边的常客,于是发誓毕业之前向她挑明心思。可,追女孩子,总是要制造一点浪漫的,对于他这个贫家学子来说,浪漫这东西实在是有些奢侈。
  
  为了这次浪漫的约会,他课余去做家教,四个月后,兜里有了几张被汗水泡的发软的百元人民币。
  
  他鼓起勇气给她写了信,约她去看电影。
  
  约定的日子到了,忐忑不安的他在电影院民口等来了她。
  
  看得出,她还记得他呢,冲他羞羞地笑,而他,紧张的只会把一筒爆米花塞进她怀里,不停地说:吃吧,吃吧。
  
  她就笑了,有点顽皮。
  
  看完电影,他们漫无目的的走在街上,他一边努力的找话,一边向该给她买点什么礼物。路过一家专卖店时,他拐进去,说:进来看看吧。
  
  她说好。
  
  她貌似有一搭没一搭的随着他在里面转。他很喜欢模特身上的一款裙子,指了给她看,说:真漂亮。
  
  她也点头说漂亮。
  
  他怂恿她试一下,心想,如果她穿着好看,他就买下来作为礼物送给她。在等她换衣服的空当里,他顺手翻了一下标价牌,心就咯噔一下子,那款裙子的价格,远远不是他兜里拿几张人民币能买得下来的。一时间,他恨不能找个地缝钻进去。
  
  她从试衣间出来,把裙子塞给服务生说:太瘦了,我穿不下。
  
  服务生忙说在给她找条大一码的,她说不用了,就叫他一起出去了。
  
  他如释重负,但也有点失落,觉得那条裙子,穿在她身上,一定是美的,而且她并不知道他兜里的钱是买不起这条裙子的,她坚持不肯试一条大码的,难道是在婉转的拒绝他?
  
  这么想着,他就有些难受,决定继续做家教,攒足了钱,就去把那条裙子买来,送给她,如果她不肯收,就说明他真的是在拒绝他。
  
  省吃俭用了半个月后,他终于可以去买那条裙子了,却没了。服务生还认识他,笑着问:你女朋友没穿给你看?
  
  他蒙了。
  
  在他们约会的第二天,她就到店里买走了那条裙子。
  
  原来,她真的是对他无意,便以裙子太瘦为由,拒绝了他的礼物。他是这么想的。
  
  但,他还是交了定金,让服务生再进一条同款的裙子,已不再是为了送她,二十几年那段沉默了两年,没来得及开始就消失的爱情。
  
  后来,她毕业了,工作了,结婚了,在一次会议上以外的遇见了她。他感慨地说起了当年对她的好感和那条裙子的故事,她安静地听着,流了泪。
  
  原来,她在试衣间里试了一下就脱下来了。不是裙子瘦,是不敢穿出来给他看,因为那条裙子穿在她身上,实在是太漂亮了。若是他看了,肯定会买给她的,而她早就听说过他家境不好,就更不忍心让他为自己花钱了。第二天,她就跑去买了那条裙子,一直在等啊等啊,等他再一次约她时,穿给他看,可是,他没有。
  
  她流着泪说,如果我早知道你会那么想,无论如何我也要让你给我买那条裙子。
  
  他也黯然神伤,说如果早知道是这样,说什么我也不会放手。
  
  如果,他们多说一句话,或许,就不会是今天的相对垂泪。
  
  可是,曾经沧海后,所有的如果,都是一个悲伤的假命题,哪个没有发生在昨天的如果,永远不会跳出来改变今天的悲伤失落,所以,如果爱,就请说,别让我们有说如果得机会,因为,一说如果,心就疼了。

(转)真爱不流通

我记住那个秀气的女孩儿

  我第一次去家门口附近新开张的超市,便记住了周可。

  我基本是不愿闲逛的,尽管网站编辑的工作,让我可以不必坐班,自由行动,但我宁愿将一个月的吃食全部买到。那天我又买了一大堆的东西,正漫不经心地朝前推着,突然冲过来一个服务员,把我的推车啪地打翻了,里面瓶装的罐头啊甜酱啊蜂蜜啊,就这样劈里啪啦碎了一地。就在我刚要在女孩子一连串的抱歉声里,皱眉埋怨的时候,旁边一个貌似超市领导的中年女人,立刻发疯似地怒吼道:你,立刻收拾铺盖卷,交上罚款,走人!

  我站在那里,看着四处流溢的汁液,不知道该说些什么,才能让这个女人,平息心内愤怒。周围的人,也投来了同情的眼光,看我对面那个已经哗哗流出眼泪来的服务员。我觉得很是尴尬,正要以吃亏是福的心态,息事宁人,旁边便挤进来一个秀气的女孩子,柔声对我说:先生,这些碎掉的东西,我来赔好吧,麻烦您再去拿新的,到前台交款,剩下的,由我来处理,多谢您的谅解与合作。我心内郁积的烦闷,在这样温情的话语里,一下子消失殆尽。我回敬她一个感激的微笑,便迅速推车走开。但远远地,还是听见她的细语,说:领班,所有的赔偿,都由我来支付,但恳请您一定要留下田妹,她只是因为匆忙去取货物,才生出这样的失误。

  一切又回复到先前的和谐宁静的时候,我才排队去前台付款。很仔细地看清了这个一直有和暖微笑的女孩的胸牌,上面写着:周可,26号收银员。

  我突然开始喜欢上购物,尤其是将一段时间里需要的东西,分成若干次来买。

  我甚至可以在周末无事可做的午后,为了一管小小的牙膏,而在超市里流连两个小时,只为身边顾客渐少,我可以低声与周可聊几句天。

  我知道周可每天9点上班,8点12分,她会准时从我楼下小广场上,骑车经过。而我,当然也会“准时”地,买早点回来。且将从影视剧里学来的招牌似的迷人微笑,绽放给她。

  但我还是不可抑止的,喜欢上了周可。尽管我的朋友们因此都笑骂我,说爱情在我,来得如此快,必定去得也早。天下善良柔美的女子多了,为什么偏要看上一个连学历都没有的收银员呢?

对不起,我不想浪费你的时间

  在我第100次出现在超市前台的时候,周可把零钱递给我的那个片刻,顺手将一张小小的纸条夹在了其中。我狂喜,提了东西便飞奔出超市。小心翼翼地打开那张纸条。只有一行娟秀的字,说:可以一次将所需的东西全买走吗,这会节约你的时间。

  我在没有搞明白这句话的真正含义的时候,就掉转头去找周可。其实我转回来,是想当着周可所有同事的面,告诉周可,从今天开始,我不想再做她的顾客,我要改做她的 “司机”,而且,是专车司机。但看到周可脸上略略的疲惫,我还是忍住了自己爱张扬的恶习。

  但并没有走远,而是在拐角处,一直等,一直等,等到夜幕降临,周可和同事们推车笑闹着走过来。我几乎是跑过去,拦住了周可,说,周可,我可以请你吃饭吗?我相信这是一个世界上最俗的求爱方式,但我还是忘记了想了一下午的浪漫求爱语言,只记住了这最恶俗的一句。

  结果是,周可还是坚决地走掉了。那个叫田妹的女孩,却是在骑了一段路后,又转身折了回来。她开口便道:以后你可以不再为了周可姐姐,来超市买东西吗。因为,你已经给周可姐姐带来了许多麻烦了。

我没想到,我这个频频光临超市,偶尔兴起,就给他们领导发封电子邮件,说几句周可好话的神秘人物,竟然被嫉妒她的一些同事,添油加醋地描述成她找来的帮手。还说,周可对那些有钱的主顾,之所以超乎寻常的热情和耐心,不过是为了给自己找条出路,借他们写来的表扬信,来成就自己,从而往领班的路上走。而我对周可的嘘寒问暖和独特眼神,则被他们说成私下里受了周可的诱惑。又说,一个马上要定亲的女子,用这样暧昧的方式来拉拢顾客,真是不知道自重,让人轻视。

  这样的流言蜚语,周可从来没有给我提起过。而我,遇到这样善良隐忍的女子,却是不懂得如何怜惜和珍爱。

  我一个星期都没有再去超市,后来实在无法忍受对周可的思念,决定做最后一博,将买来的大束玫瑰,当着他们领班的面,送给她。但当我傻瓜一样被许多人看过来时,我才发现,那个26号收银员,已经换成一个面目冷淡一脸雀斑的女人。

  我是从那个只对顾客轻言细语的领班口中,得知周可已经辞职,去了另一家超市,而且,听说她马上就要回家定亲了!

把幸福全交给你,无需找零

  你相信这个世界上会有奇迹吗?如果你为了找到某个人,连工作都可以不要,天天骑着破旧的自行车,在这个城市大大小小的超市四处寻找;如果你的皮肤,晒到连你苦苦寻找的人都认不出;如果你像当初100次进出超市一样,搜索到第100次,而后突然听到有人在背后叫你,当你回头,发现这正是你日夜思念的女孩——难道,这还算不上奇迹吗?

  上天就是这样将周可重新带到了我的面前,给我一次可以用心弥补的机会。周可说,我已经定亲了。我说,中国人都知道,定亲不是结婚,所以谁都没有办法阻止我。周可还说,我只是一个普通的收银员,你以后总会后悔。我回复说,我也只是一个平庸的小人物,渴望能有一份与柴米油盐有关的爱情,能结实地给我的胃以慰藉。我用最俗的方式,追求一份爱情,也希望你能原谅我曾经给你带来的伤害,用最俗的方式,告诉我说,行,以后你的钱,就全都交给我吧,当然,无需找零。

  像无数童话里说的那样,我和周可幸福地生活在一起。也像无数凡俗的爱人一样,她掌管我的胃,亦掌管我的钱袋。只是,这样好的收银员,我情愿让她像握一枚硬币一样,牢牢地握在她的手心一生一世,再不流通到别处去。

(转)平凡的小蝌蚪时间

  妈妈是因为生弟弟走的。所以开始时,她挺讨厌那个大脑袋的小家伙的。她叫他小蝌蚪。可是,无论她多讨厌他,他还是成了她的小尾巴。

  小蝌蚪5岁的时候,老爸再婚。来的是个妖艳的女人,是拧着鼻子进她家门的。那时,她已经10岁了,她的心里早早地打好了主意:要想欺负我跟小蝌蚪,没门儿。

  自打后妈进了门,老爸就成了甩手掌柜。他吓唬她说:英子,好好跟你妈处。你妈心善,你要是为难她,小心我揍你。

  邻居奶奶说得没错,有后妈就有后爸。她梗着脖子,眼泪一行一行往下掉。后妈说:你看,你看,好像谁给她气受了似的。

  小蝌蚪没心没肺地吃后妈做的饭,气得她一巴掌打过去,吃吃吃,你就知道吃!小蝌蚪哇的一声哭了起来。

  她也哭。面对家里两个唱秦腔的,老爸急了:哭,哭,哭,再哭,你那短命的妈也不会管你们俩。

  她抹了抹眼睛,端了碗,使劲往嘴里扒饭,饭和着眼泪吃到嘴里,是咸的。

  小蝌蚪拿眼睛瞄着她,小脸上像鱼鳞片一样,是在风里哭被风皴裂的。她夹了一筷子菜给他,她第一次那么小声跟他说:吃吧!

  小蝌蚪像得了好处似的,使劲笑了一下,埋头吃了起来。

  那边老爸叹了口气,后妈把碗放在桌子上,声儿很大。

  那晚的月亮不亮,她翻来覆去睡不着。小蝌蚪又踢被子,她起来帮他盖上。他回过身来,胳膊紧紧地搂住她的胳膊,她的眼泪一下子涌了出来。

  她在心里向妈妈承诺:她再不欺负他了。她说:妈,你一定是送小蝌蚪来跟我做伴儿的。

  她从学校回来,离家还很远就听到小蝌蚪在哭。她急着往家跑,摔了,起来拨拉拨拉灰,撞进屋子里。后妈正拿着扫炕的笤帚往小蝌蚪身上打。她疯了一样扑上去。后妈停了手,脸上有些讪讪的,说:小孩子祸害人,好好的玻璃杯往地上扔。

  小蝌蚪抽搭抽搭地拉着她的手。她梗起脖子不讲理:摔了咋啦?他是老秦家的独苗,老秦家的东西都是他的,你管得着?

  小蝌蚪的身上都是红红的笤帚印子。老爸回来时,她掀起衣服给老爸看:我妈生我弟不是让你们来打的,我告诉你们,再有这一次,我不会饶过她。

  晚上睡觉时,小蝌蚪说:姐,你像大英雄。你一说话,就把坏人吓没电了。她说:弟,以后她打你,你就跑。别硬挺着。

  在外面,她给后妈戴高帽。出去,谁说:英子这衣服真漂亮啊。她赶紧说:我妈给做的,我妈人可好了。就是有点儿偏心眼儿,向着我弟。

  后妈的脸笑成了一朵花,跟着说:你这丫头,净挑眼,他小,还不可着他点儿。其实,她心里巴不得后妈对小蝌蚪好。

  她从来不自己在外面玩儿,走哪儿都带着小蝌蚪。15岁那年,她们全家搬去了县城。老爸整日里在外面忙,后妈花枝招展地出去跳舞打麻将。家里只剩下她和小蝌蚪。她成了大家长。天热了,她掏出一毛钱,那是没吃早餐省下来的,给他买了根冰棍,小蝌蚪吃,她看着,天可真热。

  小蝌蚪的学习都是她管着。她说:小蝌蚪,咱俩没妈,咱俩都得好好学习,将来都考到北京去。小蝌蚪不知道没妈跟好好学习有什么关系,他把拼音写成一锅粥,她说了一次又一次,他总是改不了。她急了,一巴掌打在他的脸上,她说:你这么不争气,对得起谁啊?

  先哭的是她。小蝌蚪说:姐,你别哭。我好好写。低下头,吭哧吭哧把一锅粥的拼音都擦了,再写。

  小蝌蚪的家长会是她去开的。老师上下瞄了她几眼,说:你家大人呢?她干净利索地说:我就是我家大人。小蝌蚪,哦,不,秦岭是我弟,从小是我带大的。老师立刻换了目光,她说:秦岭的成绩总是不大理想……

  她的成绩那么好,小蝌蚪怎么就那么差呢?谁都没教过她,管过她,她还不照样次次考第一。

  她不让小蝌蚪看电视,有时把他管得鬼哭狼嚎的,他哭,她也跟着哭。后妈回来了,说:英子,没你这样当姐的,你这样管秦岭,人家还以为我这后妈怎么他了呢?

  她说:没做亏心事,怕啥鬼叫门?

  她一路拔着尖儿考上大学。她没报外省的学校,只报了省城的。那个夏天,老爸的脸上都是亮堂堂的,他们老秦家几辈儿都没出过一个大学生。

  她跟老爸谈,她说她要带秦岭去上大学。她不能把他扔在这个家里,那样她放心不下。老爸的脸拉得老长。这个丫头净能作妖,有上学带弟弟的吗?

  她拧,要是不同意把小蝌蚪一起带去,这学她就不上了。还有,他俩的生活费她会自己想办法解决。

  老爸叹了口气,他知道她是害怕后妈摔打秦岭。他先去了省城,给他们姐弟俩租了间民房。然后,他把自己攒的一千多块私房钱留给他俩。老爸说:岭儿,听你姐的话。老爸的眼睛有些湿了。

  大一,学校里还不让走读,必须住在学校里。她就拜托了邻居奶奶看着点小蝌蚪。小蝌蚪15岁了,成绩还是不好。她气,她急,却没有办法。

  那天学校举行运动会,没她什么事儿,她悄悄溜出来,跑去小蝌蚪的学校,小蝌蚪居然没有去上课。她急了,奔回家。邻居奶奶说昨晚那小孩子也没回来。

  她的心悬到嗓子眼儿,不会出什么事吧?小蝌蚪的老师说:去网吧,他们那些孩子总是去网吧玩游戏。

  她疯了一样出去找。终于在一家网吧找到熬红了眼睛的小蝌蚪时,她先哭了。她拉着他的手回家,关上门,边打他边哭。她说:你以为谁愿意管你吗?要不是妈死得早,谁稀罕管你……

  她大学毕业,在一家进出口公司做会计。

  小蝌蚪高中毕业,拒绝考大学。她逼他,他居然离家出走了。他在留给她的信里写着:姐,这么多年,我知道你是为我好,可是,什么事都是你说了算,你以为人人都像你一样事事拔尖吗?我是人,不是东西,我有我自己的想法……

  她拿着那封信愣愣地坐在床边。什么时候算完呢,帮他上完大学,有了事业,成了家?可是到头来,他却是怨她的。她手脚冰凉。

  半个月后,小蝌蚪回来了。是被她从派出所领回来的。他偷建筑工地上的钢材,她交了罚款,替他做担保。

  她做了半锅红烧肉,焖了米饭,盛给他吃。这次,她没骂他。他的眼泪流进碗里,他说:姐,你骂我吧!

  泪流进她的嘴里。每个人都会有他自己的人生,她想:他不爱学习,那就由他去吧!

  她抹了把眼泪,转过头,笑着给他夹菜,她说:姐姐允许你做只平凡的小蝌蚪,但不能做坏蝌蚪。

  她结婚时,小蝌蚪在美容院做学徒。她的日子安稳起来。小蝌蚪却还在折腾。开了小发廊,生意惨淡。她替他重新找铺面,把家里的存折都拿出来给他。

  小蝌蚪的生意好了起来。有钱了,花天酒地。她在迪厅里找到他,旁边是口哨声。小蝌蚪没有跟她一起出来。

  整晚她都睡不着觉。她害怕他像那些嗑药的孩子一样,那她可怎么向死去的妈妈交代呢?

  小蝌蚪没有变坏。他提了东西来看她。他说:姐,你什么都好,就是爱操心。她说:我不操心,你能长这么大?

  说完,她自己先笑了。操不操心小蝌蚪都得长大。

  小蝌蚪拿了镜子凑到她跟前,说:看,多老的女人啊!她拧他,敢说我老。

  镜子里,小蝌蚪已经不是大头大脑的样子了,变得很英俊。还有,他跟她,长得真的很像很像。

  她说:弟,清明节,咱们去给妈上个坟吧!

  时光恍惚回到了从前。那时,他呱呱落地,她失声痛哭。他为新生,她为失去亲人。

  他们是一棵树上的两根树枝,除了彼此陪伴,共同成长,还能怎么样呢?

  站在妈的坟前,她泪水长流,她说:妈,谢谢你,谢谢你给我送来了个平凡的小蝌蚪。

SDK中使用GDI+出现的编译问题解决方案

GDI+是从windows XP开始提供的图形库,基于GDI构建

在MFC中使用GDI+,编译时不会出现什么大的问题,但是SDK中却会报告很多未定义的类型,其中主要是和COM有关的声明,这里就这一小问题进行解决。

首先要知道,GDI+是操作系统提供的模块,不和特定的编程语言和库相关联,所以纯净的SDK中是肯定可以使用GDI+的

其次,使用GDI+需要的头文件为GdiPlus.h,对应的lib文件为gdiplus.lib,GDI+被声明进Gdiplus命名空间中,GDI+库需要使用GdiplusStartup进行初始化,使用GdiplusShutdown进行清理(类似socket)。

好了,有了上述背景,接着进入要解决的问题。

如果在SDK中使用GDI+的话,做完上述操作之后进行编译,会报告类似如下的编译错误:

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2440: “初始化”: 无法从“const char [37]”转换为“int”
1> 没有使该转换得以执行的上下文
1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2146: 语法错误 : 缺少“;”(在标识符“IImageBytes”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2470: “IImageBytes”: 看起来像函数定义,但没有参数列表;跳过明显的函数体
。。。。。。。。。。。。。

。。。。。。。。。。。。。

因为上述需要的声明信息,在windows.h和comdef.h两个头文件中,一般使用SDK写程序的朋友都知道要添加windows.h头文件,其实windows.h中是含有comdef.h的声明的。

但是如果你使用的IDE太智能了(比如我用的VC2008),在stdafx.h中会创建WIN32_LEAN_AND_MEAN宏,所以会屏蔽comdef.h,这样就会导致声明缺失问题。

删除WIN32_LEAN_AND_MEAN宏或者手动添加包含comdef.h头文件就可以了。