Profiel van 金银乃身外之物白羊的家Foto'sWeblogLijstenMeer ![]() | Help |
白羊的家白羊座 我的标志 |
|||||||
|
15 januari 感悟变迁 小的时候很喜欢长大,刚长大时候却很怀念小时候。又是理想真空带。考上大学之后,最近跳槽成功!感觉又找不到目标了。有时候工作很忙,感觉自己活着还很有意义,有时候却很有挫折感。生活还是一样的过。
我是一个比较怀旧的人,和以前的朋友聊天感觉这个世界变了,而且变的越来越快了。心里有种对未来的恐惧,不过心中还是有很多希望。08年给我的记忆里留下了很多难忘的事情。
一月:感受在深圳的第二年。南方下大雪居然把南方电网弄崩溃了,不巧南方的铁路运输是用电的所以回不了家了。工作还是在寻觅,快过年了也不去想那么多了。
二月:在深圳过年,过年时深圳人突然少了很多。去看了场电影,回来有些晚,街上居然连人都见不到。还好政府为了在深圳过年的人准备了很多活动,半价游世界之窗(我是农民工,我半价我优先)。
三月:工作还是在找,没什么新目标。30,31日拍了婚纱照,在海边玩的很high。
四月:过生日老婆送了我一条银项链。幸福ing。跳槽目标出现。
五月:15日拿到婚纱照,感觉有点遗憾,不过整体效果不错。这个月我已经开始放弃跳槽的念头了,偏偏却得到了offer。投奔北京的老乡,找房子搬家很忙都晒黑了,为物流事业做贡献花了好多钱。5月27日第一天上班。并憧憬美好的未来。
六月:自己在北京一个人很空虚。工作不是很忙。很想她。。。。
七月:工作感觉有些起色感觉自己很有价值。想念她。7月20日看到了她,决定再也不和她分开了。
八月:奥运会公司发票去看篮球很happy,但是她还是觉得这里没有家的感觉。
九月:这个月里工作中遇到很大的挫折,没有任何支持,做一件没有意义的事情只是为了完成流程,还好在婚假前完成。22日拿到传说中的结婚证。偏偏当天她感冒烧得一踏糊涂,现在还说是昏迷中被我骗到手的。鬼才信这是真的。
十月:4日结婚。还提前准备讲话内容。结婚大部分时间都是在演戏给人看,没感觉。当主持人煽情的时候她再也忍不住了哭了。以前的朋友也来了但是人多照顾不周希望他们不要在意。现在还不相信结婚的事实,还是在介绍她给别人的时候走嘴说这是我女朋友.......还没有转换角色。全球金融危机,中国未能幸免,还好公司不裁员。
十一月:公司流程完善中起到了点小作用,也了解了一下公司的工作流程,感觉法国人真是很厉害,前提是不惜成本。十年前做出来的东西还是很先进(general Model 类似clearcase UCM)。感觉这是我人生中最幸福的时光,不会为钱发愁有心爱的人在身边,憧憬美好的将来并幸福ing.....
十二月:Multinational 就是和International不一样我们有权利决定公司的策略与流程,同时有共享国外经验的机会。
23 juni 构建我的生活,这样快乐吗?(需求挖掘)我要的是什么? (设计模型与实现)先进的敏捷的 (集成构建)追求着迷惑中 (第一论测试构建)梦想很美但我摸不到它 后来那了为了骗取我公司信息的猎头又厚着脸皮找到我告诉了我这一切还说还好没推荐你去这个公司。还说又一个更好的机会(Arris)也在亚洲建立研发中心,还聘请了一个资深的UT的教授主持建立改中心。这此又是三个猎头同时找到我,我把我的简历发给了另一个猎头,因为我觉得另外一个猎头会比较诚实。我为了试探一下那个猎头是否在说谎我同时又把简历交给了那个华为出身的猎头。结果不出我所料他又在向我骗取我们公司的信息。后来听一个资深行业专家说IPTV在中国的市场很糟糕,很难运作起来。 (第三轮测试构建)爱我的我不爱 (第四轮测试构建)曾经的心动 (第五轮全回归测试构建)从深度发展到广度发展的诱惑 (第六轮全回归测试构建)默然回首那人在灯火阑珊处 (版本发布)还有好多事情要做 (版本维护期)新的开始 一切都是新的每天都会有人让我感到惊讶,北京你好! 09 januari 冬日又到年终考核的日子了.述职报告?没什么实际的意义形式而已,这在过程改进中叫做公司流程.所有流程都是经过严格定义并且有QA和QC监控的.还好这个过程QA和QC不是主要控制角色.今年是我最有可能得到S评价的一次.上两次因为领导的综合考虑总把我考虑下去.配置管理工作很难量化,每个人管理的产品线情况不同很难做出所有人都比较信服的考核结果,谁让我的领导总把我当自己人,精神上的奖励总送给别人物质上的常考虑我.能力我不会比别人差我发布的版本不下100个,我管理的产品线过程质量从全公司倒数变成前三另一个从倒第一变成中上.难道是我幸运遇到好项目了?哪有天上掉馅饼的事!对外项目一向是公司过程质量最差的,市场压力来了一切流程都有可能缩水,质量怎么能上去?但是这些项目又是我们部门收入大户.两年来的过程改进使我们组织的过程域的管理完善了很多,从构建和部署自动化的持续构建到架构变为基于系统服务总线(System Servce BUS)的多组件架构,可以说我们的过程天天都在变.在这样频繁的变化中使用什么样的配置管理策略来满足项目组不断变化的过程,就成为了比较突出的问题. ANT、CruiseControl和IBM的ClearCase(UCM)持续构件理论。好长的的名字哦,一切核心就是自动化的就是最规范的。由于人家ibm的东西很贵免费的资料就很少,不过最好的老师就是帮助文档。从交付(deliver)开发流代码到测试流,编译原代码,制作部署包,根据测试环境配置部署包到部署测试环境后通知测试人员,所有过程都逐一实现自动化。现在我可以只点击一次鼠标或设置定时启动构建过程就可以完成集成和部署过程了。这一点改进使我从部署一次需要45分钟到2两小时的工作变成点击一次鼠标就完成了(10-30分钟自动过程)这是什么样的改变呢?测试一周我就可以节省1天的时间而且不会引入人为错误操作。 这样的过程改进也使我的思维发生了改变,从如何解决问题变成如何定位问题将问题交给合适的人去处理,配置管理员在项目组中不编写一行代码也不发现代码的bug,也很少解决技术问题,但他在项目组中充当着非常重要的角色。因为我们尽早发现问题定位问题并将问题的原因和处理方法告诉相关人员;代码错误导致测试环境不可测试?将出错信息和问题出现的原因告诉开发人员(当然现在通过持续构建过程避免这样的问题出现);开发人员搞不定?那最快的处理办法就是将问题的处理交给架构人员,这是他们的价值所在;报错但是基本功能可测试?简单了测试人员可以搞定一切,这可是他们的绩考核内容。项目经理经常问我:我的这个版本有什么问题?我会告诉他开发人员的设计和实现有些出入及时更新设计文档(开发设计不一致是QA绩效的重点项目)。架构人员问我:我们的集成过程有问题吗?我会说组件编译时依赖顺序需要调整一下顺便架构设计文档需要更新一下就好了。开发基本上都是来让我检查他们的代码和配置项是否规范和是否存在问题。测试遇到无法定位到系统的bug那就要我来检查测试环境存在的问题了,系统间接口是否正常?代码是否正确的编译到了测试环境中?总能找到问题的线索。为了完善这套系统自己想一些更加人性化的需求。自己通过编写脚本来实现它,并整合到CruiseControl的持续构建框架中。真的很上瘾!我觉得偷懒也是一种天分! 慢慢的自己对过程改进产生的很强的兴趣,这下又改变了我的思维模式,从定位问题到如何通过完善过程、工具和人员的认识来避免发生问题。学习CMMI1.2版本,这次真的是指导实践的理论了。原来理解CMMI有多神秘,其实就是做事情如何保证可以达到预期目标的方法,如果我们生活中能运用里面的思想的话我想你一定是一个说话算数从不失言的人。简单介绍一下能力等级的划分。CMMI分为5个等级以定义: 等级 连续式描述能力等级 阶段式描述能力等级 0 不完整的(Incomplete) 无(N/A) 1 已执行的(Performed) 初始的(Initial) 2 已管理的(Managed) 已管理的(Managed) 3 已定义的(Ddfined) 已定义的(Ddfined) 4 已量化管理(Quantitatively) 已量化管理(Quantitatively) Managed Managed 5 优化中的(Optimizing) 优化中的(Optimizing) 对配置管理来说4级没没有的,很难对配置管理量化管理(没办法量化我的能力水平哦!)只有一直的优化中了..... -----------------------------不能量化(Quantitatively Managed)我就自己管理(Managed)我的技能云吧--------------------------------------- Strong admin experience in using and maintenance of ClearCase (UCM), ClearQuest and RequisitePro integrated environment. Strong Java C/C++ ANT programming and SQL development skills. System administration experience in Linux and Windows operation system. Experienced in tools such as Eclipse,CruiseControl,JDeveloper,IBM Software Architect,Visual Studio 2005, ant, CVS, visio, Oracle, SQLServer,MySQL(linux), etc. Experienced in Applcation Server such as JBoss,IBM Websphere,Oracle Application Server,TomCat,IIS Be good at the model of CMMI software lifecircle. Familiar with component development based on SSB (System Servce BUS) Good English 优化中... 21 oktober 理想与现实哪个可爱? 理想与现实有多远呢?说远那就是不可实现,说近其实他就在你的心里.每个人都希望梦想成真,可目标达到了却感觉十分茫然?这又是怎么了呢?因为他缺少一个十分重要的环节--努力把理想变成显示而付出的代价.也许有人会问难道理想很容易变成了现实有什么不好吗?那我就要反问一下难道那么容易实现的理想你会感到满足吗?
来到中兴的第一天!
在昨天晚上我告别的我的朋友踏上了去中兴本部的列车,在列车上结识许多和我一样去中兴报道的新员工,我们的招聘路径不同所以不认识.不过在火车上的十多个小时我也对他们来中兴的目的有了些了解.
今天以下火车就知道,原来期待的接我们的车不可能来了,我们费劲了周折才找到报道的宿舍,已经全身都湿透了,这就是我报道的第一感受,他们(指中兴,也许以后我会用我们)对我们很不重视.只随便找了一个新人来接我们.这之后的事情就更默名奇妙了.公司的莲塘分部(原总部)总停电,正好赶上今天星期三下午停电,本来约好了下午报道的,接我们的人却不见了踪影.之后他很随便的说公司停电的时候就串修所以手机关了.
这之后也有很多让人不太理解的"大公司的所为"比如:刚住10多天就让我门人生地不熟的外地员工另找房子,还说深圳就是这个样子公司不会为员工办好所有事情.总算找到房子了把一大堆东西搬到了新家.以为被排挤的日子一去不复反了但是,因为宿舍的床上用品少了也调查不清楚是以前人弄的还是现在弄的就不报销来时候的火车费(过了几个月后给报销了),从公司的房子出来也要交水电费可是公司不管你住几天以前的帐也要均摊(黑店).公司对待我们一直都是这样的不好.也许现在习惯了也说不出什么来了.
----------------------------------------以上为个人牢骚不是本人中心思想----------------------------------------
苦吃了很多下面是受累了吧,来到公司第一天我们就加班,培训相关软件和其他知识,下了班好累呀.出来看到我们的研发大楼才有一丝在大公司工作的感觉.加班很晚回家.还忘不了玩网络游戏.真是自作自受.加班工作做不完一直有人来催,不仅要把工作做完还要做好不出错,还要满足一群写垃圾代码人的垃圾要求.(说的有些过分但是他们写的东西就是不规范出错率很高,不知道叫什么才好了).还好没出什么错误,但是不保证别人会说你好呀,每想到还有人说你这里不对那里不好.我就不明白了非要把我避急了骂大街吗?
后来才知道一个人反了错误就会去逃避现实,推卸责任而推卸责任最好的目标就是新人,因为这些人可能会出错即使没出错也弄不清楚有没有出错.还好我不是这样的人.我的反映就是积极去抗争,虽然我的对面是项目经理,但是也不能让他推得那么舒服.我把真实的情况群发了一封邮件(包括我们的部长这是我能触及到最大的官了)开始没有什么作用毕竟我们是新人人家是项目经理.可是老同事说以后工作要小心有什么情况多汇报.(那只后我工作就更加小心了,部长的态度也渐渐倾向于我们了).另外一个说不清楚又很大牌的项目(公司机密不可外泄,我只说是最核心最重要的项目自己想吧,不是我说的哦)垃圾代码现象严重,严重不走变更流程,代码和文档混乱,每次到集成阶段都是折磨,一个星期集成一次,一次集成一个星期.大牌啊,怎么管都没用,人家就是有工作没人做,混乱啊,开周例会的气愤都不一样,就象在开东京审判会.
还好我被练就了一身的工夫,和防黑的经验真是要感谢这些同事的帮助,其中有提供机会的(大牌项目),还有让我出名的(冤枉我的项目经理),还有一起吃苦受累的测试部的兄弟们.最让我感到安心就是我的领导了我每次遇到困难都是他出手相救了.还有最重量级的部长了.现在他对我的工作也比较认可了.
------------------------------吃了苦受过累冤枉气也经过了剩下的就让人舒服多了------------------------------
新员工培训不幸当上了副班长(点背没当上正的,失手了被别人装傻当上了正的,看来我的工夫还不够),更不幸的又被大家评为优秀个人,100人只有6人哦.最让我没想到的就是居然我的笔试成绩不怎么样可是论文写的还可以,结果培训成绩在前十名.不小心这个月又被评为S1(等级分为S1,A1,C1,C2)心理到是很高兴,不知道还有什么物质奖励没有.(哈哈这个每个人都想的谁叫我穷呢!)这样算不算理想变成现实呢?得到同事和领导的认同.工作还算比较满意.最让我高兴的是我又有东西可以学习了,就是自动构件.感觉很象玩游戏.使用机器语言告诉机器怎么工作来为我工作.linux下自动构件,恩听上去很爽.也许弄成了更爽了.
成功是什么呢?是可遇见的目标在你的努力过程中有步骤有计划的达成!我现在才有点在大公司工作的感觉了.(也许其他人只说他们获得了什么,但是没说怎么获得.在别人的眼中这就是梦想.但是我要去实现这些梦想就要感受到这全部的过程.这样才完整)
----生活给我痛苦,我就享受痛苦并快了的活着. 希望看到我的人和我一样快乐! 10 maart 目标中兴软件 中兴通信中国第2大软件公司几个月前我得到消息,中兴通信效仿华为的软件业务与通信业务分离的经营策略,成立了中兴软件公司分离所有软件业务。中兴软件在南昌的基地已有1000人的规模到2006年底会达到3000人。到2008年底三个基地会达到8000*3的规模。
华为也有相应的战略扩张,这之后就是摩托罗拉的跟进计划。这么大的人才资源的储备是为什么呢? 真的有那么多业务要做吗? 原来2006年是通信行业的急速扩张的一年,手机3G市场的竞争加剧了软件行业的人才紧缺的势头。在职通信软件的人才是有限的挖角的解决方案成本十分高昂,大量从人才市场招聘几乎是不可能的。所以成立了中兴软件。
软件行业最近的急速发展大多都是外包业务,大多一日本外包业务最多,外包是什么呢?就是用中国的高质量的软件程序员编写人家设计好的工程。这样技术含量不是很高的业务却是很有市场。这样下去中国的软件行业又成了最大的加工厂只能生产产品,软件工厂在中国,办公室在日本。这样的局面让每个爱国的人都很痛心棘手。不过也有少数的外包公司可以做一些设计这样的公司我想才是中国软件的希望。
随着电信行业的急速发展,中国的软件公司也可以在世界上去投标,在世界上我们的敌人你猜会是谁呢?印度!就是那些嘴里打着嘟噜说英语的人枪走的大部分的业务项目的工程。也许是他们对英语的打嘟噜的理解比我门好吧。另人欣慰的是每每遇到电信行业的投标中国的优势就很明显了。外包也要做设计了!!!!!中兴软件承担了所有中兴通信的软件项目还会有一些有设计的外包项目!这就是我要去的公司在2006呈现的急速发展的姿态!
在过几天我就要去体验以下中兴软件的氛围了,我知道前面有很多艰辛和疲惫,但走过的路却是因为有我才会不同!
07 juli 东软的减少成本政策 我的离职经过三个月前东软的人力资源经理给我打电话, 面试了一次觉得还可以 面谈了一次觉得技术没什么学的而且管理混乱, 然后通知试用期工资,才1600????(来了以后才知道还有1000的!!!) 怎么这样啊?我真那么不值钱?我那时后的工资可是3000元哦! 看看东软的牌子,在听人力资源经理的劝说,说过了试用期会张的。 这时我心理就有些感觉不对劲了。 还是好好工作吧! 来的可好工作压力还很大呢!做的都是没有技术含量的工作,还有有个比我小的领导乱分配工作!什么工作烦什么工作就都归我做。 好我做做看! 作的还算可以,就是速度快了点!她就说你这里不行那里不行应当改正!还特意发了封E-mail 给领导。下次吸取教训吧,稍微慢了一点她又过来说:你现在看看你做了多少?速度太慢了。我回答说:你什么时候做完我就能什么时候做完。我还是按时完成了!不过我看这个人我算了没办法和她处了。想想我是怎么帮助她出风头的,想到什么对工作有利的就会去告诉她,有什么工作的技巧也会和她一起探讨。作小弟也不用这样低三下四吧!!!!!! 还有更厉害的呢! 这回她不做了说有一大堆事情要做!工作都归我做了! 我就猜到他那一大堆工作就是给我挑毛病!挑了很多都不是毛病的毛病!没办法忍了! 忍无可忍! 一次在一个不爽的下午我向组长发了封辞职的邮件!(我想一切应该结束了,他们只不过是历行公事来挽留我而以)。接二连三的谈话就来了。中层以下的领导都觉得我做的可以开始谈话就集中在这个层面。但中曾是没有权利的,谈话的内容就只能是安抚。 还需再忍! 试用期就快到了转正报告也交了。在我和人力资源谈到我转正后的工资的时候,回答是这个我还要和其他的领导商量一下过几天在找你谈。(这是他们的一贯策略,等你不能在离开的时候他门才回和你谈工资的事情!他是在拖到你过了试用期离开要交违约金的时候在和你谈这样他们在谈判的时候就有绝对优势了,所以不要报有任何工资长到我期望的数值的幻想)快结束的时候他甩了一句你的能力是有的但是你要发挥出来,还有些领导看不到你的表现。难道我表现的还不够?我这样已经够招风的了! 难道他们真的想留下我? 那好把做最后的努力了,找到一个机会是一个快要离开的资深人士的讲座里,我问了一些问题,他没有回答,(其实我就有我的答案只不过想看看大家的实力)那就找高层的领导提些关于这些问题的改进建议和我对一些问题的看法。(有些问题连领导也说:恩是这个问题我们也遇到过!就是...这样算是出了风头了吧) 我很平静了... 以为什么都做了,最后就是等待最后的通知了。他们的态度还是在拖。 我的努力也到头了吧! 我问我的转正后的工资是多少人力资源说我不能做主要商量一下。其实我心理很 清楚要商量就是没戏了长不了多少! 那自己找地方吧! 随便看了下内部招聘的信息找到一个还可以的在大连。 那个经理马上打电话过来说怎么怎么样现在就能要我。 不过他似乎很关心我目前的工资! 又是什么你来我这里先看看,你来了以后我不怕你会离开? (你在东软见过这么好心的项目经理吗?他可是从五一前就开始招聘了可现在还没有招聘到人?怎么回事呢?说了这么一大队就是不提内调工资不做调整,他许的愿就等于什么都没说过.... 那就继续联系吧! 决定去面试可是前一天晚上都12点多了他打电话过来说你不用来了我家里有事 我买的是早上5点半的火车,我睡的很早正睡的迷糊呢!他说:我家里出了点事,你不用来了。我不用去了?就要到转正了不面试我怎么能随便就去呢? 我就追问他工资的问题他说:你现在至少值3000 你现在就办调转手续吧。 3000?没门! 我办着手续的时候一个小心的同事问我的事情说你现在想去那里啊,我说内调到大连至少是喜欢的工作,你怎么去那里呢?(开始还不懂他说话的语气)然后就是说你去那里就会张200块钱。(怎么会这样?明明说好了3000的?)我又找那个出事的经理确认,这回就象不关他的事了似的,说你现在来大连工资是不能到3000的要除非你过来面试!(他说话根本就是在放X)又说你要是能力够的话我还能给你长到4000呢!(这句就更不能听了。) 好我办调转! 办了一半了什么都过了,部长不签字!!!!! 第二天人力资源来了那来一分辞职申请说你只能办理辞职了调转不行了。(这可是人力资源承诺过的以前的那个资深的人走的就是内部掉转,和我不同的是他调的内部部门,现在内部部门没有职位空缺,我自己找到的是外部门的职位。原来他们之间也有斗争!!?) 我通知那边说这边掉转不行了只能辞职。他说那你还是办吧。(谈工资的资本一个一个的都没了。我心理基本已经知道答案了) 好我辞职! 我什么都办好了!静静的想了想。很冷静的给那边打电话。 我问:我现在辞职的手续办完了,如果你们现在不要我了我也没什么说的了。 他说:别呀我们不是不要你,就按你现在在东软的1600+200的地区补助 面试没问题!(又来这套还记得三个月前东软的人力资源经理给我打的电话吗?) 我很客气的说:是这样啊,那我还是再找找别的公司吧,麻烦您了。 他反而也客气起来了:哦,不麻烦。 我跟了一句:你们东软给的工资怎么那么低呢? 好我费了这么半天的劲什么都忍了换来一句是什么? 他说:没办法东软要节省成本! 我们就是他们节省成本的工具!!!! 那我们就都不发工资好了!!!! 经历了这么多我回想起来,人力资源就是在骗人,这就是东软的以人为本(我想这个本字一定就是“成本”的“本”)了吧? 所有面试时的承诺都是谎言,只要把你骗近来,你没了工作主动权就在他们了。我想东软现在的业务很少有高技术含量的,你很难用短期时间成长为核心员工,这也就是他们不在乎不断的进人不断的走人了。 我不是说留下来就没有好处。 1)如果你真的觉得你热爱这份工作想从事这方面的工作那你要先在东软好好的干,成长为核心员工(这可是需要熬年头的哦)。那时侯主动权就在你了,如果你留下来东软那个时候对你的待遇还算可以了。这样的人就解释了为什么每格三年东软就会有大批的人离开。 2)如果你真的有什么负担不可以失去工作,或你认为想找个稳定的工作。东软绝对是你的最好的选择。(不过我不是很有把握你可以在这里干一辈子,现在的竞争这么激烈拼的不光是成本而是人才,这样的东软能走多远呢?)也许你也会慢慢的变成核心老员工。资力很深对你的待遇也应该可以了。 3)想找个过度的工作,或是来东软镀金。这样的人你就打消念头吧,现在东软的违约金已经变成每年要交三个月工资了,除非你有钱不在乎。要不小心你干了1年没技术的勤杂工出去了反而没人要了!!!!! 4)就象我这样想来东软寻找未来的人,只有在试用期就离开了。 以上就是我在东软做软件测试的经历,我明天就不来了!如果觉得我说的有点道理的就一起来讨论下! 对了我刚办完辞职的手续就有一个刚来1个月的兄弟问我辞职手续怎么办啊!!!! 工资是公司对我们的希望!如果公司对我们没有什么希望的话我们只能自己寻找希望了! 我想我就凭借两年的外企工作经验流利的英语口语 VC+Oracle项目经验COM组件技术和面对对象的编程方法。。。。。。(还在这里学了点日语的基础——这个要感谢东软我现在可以自学日语了) 软件公司真的要真么做才能长远吗? 04 juli 介绍几本超酷的COM的书籍引言 实际上,写一些介绍电脑图书的文章是我长久以来的愿望。一方面由于我的朋友们经常让我为他们推荐一些切实有用的书,另一方面的原因是我在早些时候的学习并不很顺利,面对书店里鱼龙混杂的“繁华”,真是不知所措。结果横下心来,只要觉得差不多,就买!结果买了很多本不必买的书,浪费了钱财、浪费了时间。数年下来,倒也对电脑图书市场有了一些看法,产生了一些感慨。 大多数世人都不是圣贤,因此往往听得赞美,对批评却很难接受。我的许多朋友担心我的安全,劝我多说好话。可是书有好有劣,说假话当然有违初衷,说真话又难免得罪人。于是我们共商了一个“安全政策”:以“扬善”为主,在详细地介绍了一本好书之后就算提了几点不足,我想作者和出版社还是会接受的吧。至于一些不负责任的出版,我只说现象,不提名字。(请大家理解,浮生在世,安全第一、安全第一。) 目前IT行业竞争激烈,市场风云变换莫测,为了生存,所有人都超负荷地承受着各方面的压力。当程序员或者经理们好不容易从一大堆烦琐的事务中探出头来,拿起一本向往已久的专业书籍来充实自己的时候,他们当然希望尽快的把书上的东西转化为自己的思想,从而利用这宝贵而短暂的缓冲期学到更多的东西。 但可惜的是有些书却不是为了这个目的来写的,书上的话象文言文一样难懂(也许有些作者觉得只有这样才能显示出他的水平深不可测,也许有些作者压根儿就没有理解所讲的内容,只好用一大堆云山雾绕的语言来“遮羞”)。不仅如此,还有更可怕的现象,当电脑图书开始呈现出强劲的销售势头的时候,无数的“专家”、“大师”就在一夜之间涌现了出来,各种名字“大气磅礴”的书籍、培训让人目不暇接,就象大街上穿梭不息的出租车一样多。且不说他们的水平究竟如何,我想,“多必滥”似乎是一个曾被验证了许多次的道理。我就在北京某大学的布告栏里看到了“Intermet培训”的宣传,实在让人哭笑不得。 现在,形形色色的电脑培训班已经成为了“IT文化的一大风景”。对于这种现象,外国人的评论似乎更能发人深省:“在美国,是没有这么多培训班的,但是一个小学生都可以熟练地操作电脑。”“在中国,电脑培训班到处都是,但计算机技术的普及却仍然是一个问题。”“中国的自行车很多,男女老幼都会骑,但是你见到过自行车培训班吗?如果到处都是自行车培训班,在不厌其烦地教你‘自行车的轮子直径多长、有多少根辐条’等等问题,那么相信会骑自行车的人会越来越少。”写书或者译书也是如此,电脑图书的空前繁荣是否表示我们的水平很高呢?我认为不然。有时为了解决个别问题去书店找找资料,结果往往是浪费了时间还徒留“天下文章一大抄”的感慨。题材和形式都很雷同的书籍的大量充斥市场,我称之为“爆米花现象”。典故是这样的:前些年,我家门前的大街上来了一家爆米花的,因为独此一家,所以生意红红火火。可是没过多久,又雨后春笋般地涌现了十几家,沿着大街一字排开,煞是壮观。现在大家的生意均不太好,但谁都没有意见,只是我家常年“米花飘香”。如果说中国人“跟风”的脾性是祖宗传下来的,因循守旧者把它奉若神明的话,我们的电脑作者们是否应该具有一些开创精神,静下心来想一想,市场上究竟缺些什么书,不要一味地“人云亦云”。 虽然好为人师者比比皆是,但是老师却不是那么好当的,因为你得对所讲述的知识有深刻的理解,并能够用深入浅出的语言来讲给别人听。态度当然是第一位的,但是书的神圣却被不少作者和出版社践踏着。一些出版社不顾质量,一味求出书快,结果商机有了,却倒了牌子。一本原先很不错的英文书被他们翻译得驴头不对马嘴,根本不能看。而由于版权卖给了他们,其他出版社有心重翻也无能为力了。一本好书甚至一套好书就此被糟蹋,而利益受损的当然是读者。除了态度,还要有水平,书不是随便一个人都可以写出来的。时下里许多书的名字起的要多吓人有多吓人,总是让我想起了街边卖大力丸的:“只要吃了我的药,就刀枪不入、百毒不侵”。可事实上许多作者本身功力薄弱, 写不出架构与精神,于是入门书籍千篇一律就是教大家按下菜单,选择命令, 出现对话框,按下‘确定’ ...”。 真正的老师不好找,但“二把刀师傅”却到处都是(就象现在一天到晚占着电视频道的歌星、影星一样让人眼花缭乱)。加上某些出版社把关不严,这才造成了是个人就可以出书的现象。 今天,我为大家介绍几本COM的书籍,希望能在COM的学习上助君一臂之力。 欲学COM之必读书籍---《COM技术内幕》 书名:《COM技术内幕》 英文原名:《Inside COM》 作者:(美)Dale Rogerson Microsoft Press 1997 中文译者:杨秀章 清华大学出版社 1999年3月第1版 定价:50.00元(带光盘)
Microsoft Press的《Inside ……》(翻译成中文就是《……技术内幕》)系列书籍似乎总保持着独到的权威性,很少让人失望。从《Inside OLE》到《Inside Visual C++》,都十分受到读者的欢迎,名声极好。《Inside Visual C++》称的上是深入浅出的典范,大师的语言以及清楚的思路都让人收益非浅。但是可能是由于名字的原因,很多想学Visual C++的人面对这本厚厚的大作的时候,多少总有些胆怯,担心自己看不懂。少勇认为,只要你具有了一些C++的基本知识(有WIN32的概念更好),学这本书就不难,当然毅力是克服困难的秘方。 《Inside COM》也称的上是一本难得的上乘之作,这本书的最大特点在于语言轻松、循序渐进,在选材和结构组织上不难看出作者着实是煞费了一番苦心。为了把“门槛”设得低一些,作者在前几章尽可能地回避了很多诸如类厂、注册表等难点和细节问题,集中“优势兵力逐个歼灭敌人”,我不知道Dale Rogerson先生是不是从朝鲜战争中彭总司令的指挥艺术中得到的启示。在示例程序的安排上,每章都有一到两个独立于其他章节的程序,而且作者尽量使这些程序简短而完整。一方面短的例子阅读起来比较容易,另一方面读者可以将学习的重点放在COM组件的需求上,而无需费力去搞清楚复杂的例子中的那些不必要的细节及复杂的实际问题。于编程语言,作者采用的是传统的C++语言,没有涉及到任何WIN32以及MFC的知识,除了在第九章中用到了一些方便的接口指针类之外,书中的其他部分都没有用到模板类。总之作者尽可能地抛掉了一切累赘使读者能轻装前进,只要你学过标准C++,有面向对象编程的基本概念(封装性、继承性、多态性),就大可放心地读这本书了。 书的前五章讲的很明白,都是一些诸如组件、接口、引用计数、接口查询以及DLL等基本概念,无需少勇多费口舌。稍微有点美中不足的是书里边建立程序时都用如下命令: “cl Client1.cpp Create.cpp GUIDS.cpp UUID.lib” “cl/LD Cmpnt1.cpp GUIDS.cpp UUID.lib Compnt1.def”以及 “nmake ?Cf makefile”。 问题是,现在有多少人能够很熟练地写makefile文件以及运用nmake和cl命令?恐怕很少吧。于是读者就得花很多时间来琢磨程序的编译过程,费时、费事、不打粮食! 当然,作为原理性的论述,这些东西还是要讲,但是至少应该告诉读者该如何操作才对。我拿第五章的例子来说,首先是建立组件DLL:由于有了VC++,我们大可不必用“cl/LD”来做了,只需要编辑好CMPNT1.CPP、CMPNT1.DEF以及IFACE.H、GUIDS.CPP后,在VC++的集成环境中选择建立一个空的WIN32 DLL工程,把这四个文件加入工程,编译连接后CMPNT1.DLL就生成了。然后是建立客户程序:很多人往往这样做:先建立一个空的WIN32工程文件,然后把编辑好的标准C++文件加入工程,可是却通不过连接。 于是不止一次的有人问我:在VC++下如何建立标准C++的工程? (1)、随便写一个标准C的程序,越简单越好,如: main(){return 1;} 把这个文件存入你希望的目录下,一定要与你想建的工程同名。(如果你希望的工名是APPLE,那么你应该把这个文件存为APPLE.CPP)。 (2)、编译APPLE.CPP,这时VC++会提示你没有建工程,是否需要他为你缺省地建一个,当然“是”。于是VC++就在存有APPLE.CPP的目录下创建了名字为APPLE的工程。 (3)、下一着就是“过河拆桥”,从工程里删除APPLE.CPP,加入或者编辑你希望的文件即可。 书的前六章讲的很明白,都是一些诸如组件、接口、引用计数、接口查询以及DLL、HRESULT、GUID、注册表等基本概念,大体上过得去,无需少勇多费口舌。 第七章讲述类厂,利用类厂来创建组件可能会让人迷惑:不用类厂,一样可以写出功能同样强大的组件来,为什么还要多此一举呢?少勇认为,如果您只想写一个进程内的组件,那么这句话一点没错,因为您完全可以写一个全局函数来创建所有的组件,这时,我们丝毫看不出类厂有什么存在的必要性。但是,如果您要跨进程来创建组件,则情况就不同了:您能写出在其他进程中创建组件并返回句柄的“全局函数”来吗?于是乎Microsoft就想出了创建一个特殊的组件,用这个特殊组件来创建其他的组件,这个特殊组件就是类厂。在进程外组件的创建过程中,类厂接口IClassFactory是第一个跨进程的连接。 第八章是至关重要的一章,讲述了组件的复用:包容和聚合。关于“COM是不是面向对象的”之类的讨论好象一直在进行着。COM曾经被指责是一项很差的技术,原因是COM不支持传统意义上的“继承”。这里我们得这样来看这个问题:组件具有“可独立发布特性”和“二进制特性”,既然可独立发布,就不应该依赖于某个基类,否则如果基类变了,那么组件也得跟着做变动,可独立发布也就无从谈起。而组件复用又是一个现实存在的问题,因为用现成的组件实现新组件的某些功能可以节约大量的时间,COM利用包容和聚合实现了组件的复用,这样既维护了组件的“可独立发布特性”,又变相实现了“继承”。嘻嘻!把“猫”叫了个“咪”。少勇认为,关于一些无碍全局的争吵越少越好,衡量一个技术好坏的标准是看它是不是确实好用,能不能解决我们的问题。 关于本章的示例程序作一点说明: 细心的读者可能都会提出这样的问题:在Cmpnt1.cpp的CA::Init()函数中有这么一句: hr=m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY); 通过这句话,外部组件CA将得到指向内部组件IY接口的指针。但是问题就此产生了,是不是应该调用NondelegatingQueryInterface呢?种种迹象看来都应该是的,因为我们这里要得到非代理未知接口的指针。如果调用了代理未知接口的查询函数,情况会怎么样呢?代理未知接口又把请求转发给外部组件,而外部组件又把请求推回给内部组件,形成了死循环。但是运行一下例子程序,发现死循环并没有出现,一切正常!为什么?仔细一看方突然醒悟:追究一下m_pUnknownInner指针的由来,发现它是指向内部组件的非代理未知接口的,也就是说这里调用的实际上就是NondelegatingQueryInterface,当然不会出错(这也是面向对象多态性的一个体现)。 第九章除了智能指针之外,基本上没有新概念的提出(实际上智能指针也不是什么新东西,Visual C++本身就支持智能指针)。至于CUnknown和CFactory,只要前八章您切实看懂了,理解它们不是什么难事。 至于接下来的三章……呃……据说此书一出,从读者反馈的意见来看,对后几章批评颇多。少勇的观点如下:首先成绩是主要的,因为COM的跨进程调用的确很复杂,少勇也是花了九牛二虎之力才“拨云见日”,能讲成这个样子已经很不容易了。但是读者对书有意见主要是因为没有看懂,他们希望的是把一个复杂的知识用最通俗的语言讲出来,而且要严密。因此,这几章的语句和概念需要斟酌处还是很多,对于DCOM的论述应该加强(但是这确实会有一定难度)。 书的最后提供了一个七巧板的例子,有兴趣的读者可以研究一下,玩一玩,辛苦了半天,也该轻松片刻了。 书的结束语中写到:“在理解了本书介绍的所有内容之后,读者应该可以算得上是一个COM专家了”。但少勇以为,此言尚为时过早,如果把COM的知识比做一个“大树模型”,那么本书只是解决了最基本的问题,也就是大树的第一个树杈之下的主体部分。如果说完全了解COM,那么还应该了解COM这棵大树的每一个树枝、每一片树叶以及树叶上的虫子。 此书值得一看---《COM/DCOM编程指南》 书名:《COM/DCOM编程指南》 英文原名:《COM/DCOM Primer Plus》 作者:(美)Corry, Mayfield, Cadman Sams Publishing 1999 中文译者:刘云 孔雷 清华大学出版社 2000年1月第1版 定价:52.00元(带光盘)
SAMS出版的书以它独到的视角占领着市场,在读者中名声还挺不错。看他们的书可能是一条快速入门的捷径。在现在COM书籍非常短缺的时候,《COM/DCOM编程指南》称得上是一本值得一看的书。少勇对此书的评价是:关于原理的论述中规中矩,无明显的破绽,而且对相关知识的涉及颇广,语言也还算流畅,倒也十分难得,只可惜火候尚欠,不够深入,因此,称不上是一本“COM专著”。读完此书,少勇闭目细品,就好象在满怀希望地吃了一顿大餐之后却没有哪道菜是上档次的“大厨手艺”,不免觉得有些美中不足。不过,从实用的角度来看,此书却也称得上是上乘之作了,不光给出了完整的例子,在第十章还给出了DCOMCNFG的配置示例,实为难得。读者如果把这本书和其他的一些书搭配着看,《指南》当之无愧是一个优秀的“二传手”(看得出译者在为本书取名字的时候确实花了一番心思,倒也十分得体)。 SAMS公司的书的一贯风格是门槛较底,学起来基本没有什么痛苦。但COM却是一种比较高级的技术,“零痛苦”的学习似乎不太可能,而且SAMS总是力求实用,于是免不了举一些实际的例子,因此所涉及的知识就比较多了。如果您对C++、事件驱动编程以及MFC还不够了解的话,则应该在阅读此书之前先去看一些相关知识的书籍。 书中关于接口定义语言(IDL)的论述可以算是一个闪光点。IDL最初并不是设计为描述COM类和接口的一种方法,而是开放软件基金会为分布式计算环境(DCE)规定的RPC IDL。微软最初把IDL设想为描述可用于Windows NT机器间通信的RPC接口的一种方法,后来逐步加入了许多专用于COM组件的关键字,用来描述COM接口以及COM对象。 谈到IDL和ODL,可能不少读者会感到很迷惑。不过没办法,这是一个历史遗留问题,书中第170页的论述相信会给您一个满意的答复。 美国人写书,喜欢把一些背景文化写进去,少勇非常赞赏。比如这本书中提到了“COM的生活方式”,着实让人眼睛一亮、精神为之一震。Don Box 是一位COM领域泰斗级的人物,在MSDN 中时常能见到他的大作,他所说的“COM的生活方式”实际上是在区别COM编程与传统的C++程序开发的不同以及在软件工程上的改变。 书中有如下评论: “强烈建议你以IDL开始所有的编程工作,不要将IDL仅仅用于生成本地服务器的代理和占位模块。正象Don Box曾经说过的,‘真正的COM程序员用IDL开始工作’”。 虽然少勇对大师非常尊重,但还是认为此言过于绝对化和偏激了。因为Don Box所讲的实际上是一种理想化的软件开发方式,我们基本遇不到。按照Don Box的理论,如果我们开发一个工程,全部运用COM组件,那么在开始编程之前应该设计好所有的接口,由于接口的不变性,设计好之后就不应该改变了,因此也就应该从IDL开始所有的工作了。回到现实中来,我们的程序员在做一个产品的时候,一般都先构造一个程序框架,组件只是完成一些基本功能,不是工程的全部,于是大师的言论在此并不适合我们。 许多人认为,“在软件上,美国的今天就是我们的明天”,于是纷纷把美国人的发明、理论拿来当作圣经来读。但少勇说:“借鉴的同时还要有选择、有思考,看它是不是切实符合中国的国情。” 书的最后一章利用前面讲述的内容创建了一个真正的分布式应用的例子,建议读者仔细研读一下(包括本书中的其他程序),要勇于去吃螃蟹。否则就算少勇抹一抹嘴边的油,告诉您说螃蟹是何等的美味,可能信的人也不多。 强力推荐!COM的“宝典专著”---《COM原理与应用》 书名:《COM原理与应用》 作者:潘爱民 清华大学出版社 1999年11月第1版 定价:39.00元
朴素无华的外表、平淡无奇的名字、几乎白送的价格是少勇对这本书的第一感觉。但翻开此书,简单地浏览之后,少勇顿时“心跳加速、浑身来电”,揉了揉眼睛,大有一种捡了金子的喜悦。于是一章一章细细品来,越看越起劲,越读越过瘾,不禁惊呼:“此书乃COM之宝典专著也”! 少勇认为,本书具有“系统性、严密性、深入性、实用性”四大特点。“系统性”是说此书所论述的知识涉及到了COM领域的各个方面,不仅全面、而且系统。看的出潘爱民先生的功底之深厚决非常人所能及,他不仅对COM有着深入的研究,而且对C++的理解也堪称炉火纯青(作者翻译了《Visual C++技术内幕》[第四版]),因此讲起来条理清晰、错落有致、自成体系,有如滔滔长江之水接海连天,使人心旷神怡、流连忘返。“严密性”是说书中的语句措辞颇为讲究,经得起推敲。有些地方初看似有不妥之嫌疑,但仔细一品,才发现其中的奥妙,只是自己以前没有理解得如此深刻而已。“深入性”是说此书并不是一本泛泛而谈的书,许多章节的论述都堪称精辟、给人以耳目一新的感觉,乃大师力作。由于作者的功力深厚,因此理论与实践的结合可谓“无缝”,因此“实用性”也是本书的一大特点。 全书分为三个部分,第一部分包括前五章,讲述COM的原理。少勇认为,如果几个秀才作同样题目的命题作文,很容易就能看出水平的高低来。关于如组件、接口、DLL以及跨进程调用等最基本的概念可能所有讲COM的书上都会讲,但深浅不一。在本书中,作者不仅讲述了基本理论,还对其进行了润色、加工,许多地方还作了总结,很有条理地向读者说个“一、二、三”。与现在很多人把英文资料拿来拼拼凑凑就可以“堆”出一本书相比,作者的做法实在难能可贵。 第四章讲述了客户程序创建COM对象的进程透明性。大家知道,不管是进程内组件还是进程外组件,客户程序可以用一致的方法创建COM对象。对于进程内组件,无论是创建过程,还是对接口函数的调用过程,我们都可以按照一般的同一进程内部函数调用的过程来理解组件和客户之间交互操作;但对于进程外组件,实际的情形要复杂的多,因为组件程序和客户程序拥有不同的进程空间,所以,它们之间所有的交互过程都涉及到进程之间的通信过程。 虽然客户程序和对象在不同的进程空间中,但所有对接口的调用都是间接进行的,客户程序调用接口成员函数就如调用本进程内的函数一样,这正是COM所达到的透明效果。 在这一节里,作者不仅介绍了组件进程和客户进程的内存模型,还对接口调用过程中的列集(marshaling)处理过程作了详细的论述,并且给出了实现自定义接口的标准列集程序的过程,最后还以例子说明了进程外组件自定义接口的实现过程。 少勇认为,这一部分的论述不光深入,而且极具条理性。以类厂对象的列集过程为例,书中有如下论述: “(1)、首先确定注册对象(即类厂对象)提供的代理对象的CLSID,如果注册对象不能提供代理对象的CLSID,则使用标准的列集代理对象。然后CoRegisterClassObject函数要求注册对象提供列集数据包,实际上是一个字节流,它包含了用于代理对象与组件对象的跨进程连接所必需的信息。如果注册对象不能提供这样的数据包,则使用COM提供的标准列集数据包。 (2)、COM把代理对象的CLSID和列集数据包传输到客户进程中,CoGetClassObject函数正在等待这些数据。 (3)、在客户进程中,COM根据传输过来的CLSID创建代理对象,并且把列集数据包传给代理对象。因为,列集数据包包含了代理对象与组件对象的连接信息,所以代理对象利用数据包建立与组件的连接。” 象这样总结性的论述几乎遍布了书的每一个章节。能作到这一点本以非常难得,但作者并没有就此收笔,他还详细介绍了IMarshal接口,并给出了自定义列集的实现。象这样的知识,您在其他书中恐怕找不到吧。 第五章,“用Visual C++开发COM应用”主要从两个方面进行了论述,一个是MFC,一个是ATL。由于作者在Visual C++方面的造诣,因此这一部分中对于MFC的论述可以称的上在同类书中首屈一指。我这么说是因为一般书籍在讲到这里时,对用MFC实现COM接口的机制往往都有所涉及,但大多论述不够,长久以来,少勇总有一种“走出餐馆却没有吃饱”的感觉,不免遗憾。但是这一点本书却做到了,通过对DECLARE_INTERFACE_MAP()、BEGIN_INTERFACE_MAP、END_INTERFACE_MAP、INTERFACE_PART、INIT_INTERFACE_PART等宏的深入剖析,使读者能对MFC如何实现COM接口、如何定义接口映射表有一个全面的认识。如果您需要用MFC来编写COM组件的话,相信一定会从受益非浅。接下来对于ATL的论述略显单薄,但所讲内容都是精华,具有较高的参考价值。少勇认为,在ATL日益受到重视的今天,市场上尚缺少一本系统讲述ATL的书籍,但不知哪位“大侠”有心情填补此缺。 书的第二部分是六到十章,讲述了COM规范中扩展的一些内容,包括可连接对象通信机制、结构化存储技术、COM对象的名字对象技术、统一传输机制以及DCOM。如果读者要全面理解COM,这部分内容为您提供了这些技术的细节。以前,很少有书能够如此系统地介绍这些技术,就算偶尔有书涉及一二,也都不很深入。而且这部分知识涉及到了COM应用中的许多实际问题,比如说OLE,虽然已经诞生很多年了,但大多数人对它还是一知半解、掌握得很不够。虽说从各种媒体上您可以找到许多资料,但把这些资料整理出来系统地讲述,并不多见。纵观这几章的论述,可以看出作者一定认真研究过COM体系结构以及OLE的许多内部资料和源码,并通过自己的加工把这些原本支离破碎而且难懂的材料做成了一顿“美味大餐”。“难得,难得,”少勇看完这几章,不禁赞不绝口,“集大成者也!”(实际上,这里的每一个话题少勇都有一大堆感想要与您分享,只可惜篇幅所限,只能把最精彩的部分拿出来介绍,欲知详情,还是买一本回家慢慢看吧。) DCOM是不得不说的,它是COM从桌面环境走向分布式网络环境的必然。从COM逐渐过度到DCOM,这部分堪称“深入浅出”的典范,不仅详细介绍了DCOM的原理和特点、用户如何创建DCOM组件,还对连接管理、并发管理作了详细的论述。记得我在评《COM技术内幕》时讲过其最后几章不太令人满意吗?那么看潘爱民先生的书会弥补您的缺憾。 在第二部分,我的最后一个话题是关于安全性的,因为对于一个分布式系统来说,这太重要了。《COM原理与应用》在两个地方对安全性进行了论述,第一次是在第四章,提到了激活安全性和调用安全性。这里从COM特性的角度讲述了COM安全性,侧重于安全模型结构。第二次是在第十章,提到了访问安全性和激发安全性,侧重于DCOM在分布式环境下的安全模型的配置情况,强调实用性。到此,有些读者可能就会觉得这四个“安全性”混在一起,磕磕碰碰、搅搅拌拌、倒是一盘好菜,只可惜看不明白。少勇认为,这只是因为目前COM领域名词太多、叫法又十分混乱,Microsoft尚是如此,何况他人?因此,这对于写书的人来说,确实很难办。于是有些作者采取了回避的政策,讲激活安全性和调用安全性就不讲访问安全性和激发安全性,而如果要讲访问安全性和激发安全性则对激活安全性和调用安全性只字不提。这样虽然解了一时之困,但不利于读者建立一个完整的概念。《COM原理与应用》并没有回避困难,其“深入性”又一次得到了体现。看得出来,在写这部分的时候,作者也下了一番工夫,他以不同的角度对COM安全性作了有层次、有重点的论述,我认为其可贵之处有二:其一,COM的资料本十分难找,关于安全性的材料就更少了,能搜集到比较系统的资料实在不容易;其二,关于这部分知识以前基本没有权威性论述,全凭写书的人自己领悟,这就要求作者具有很好的功底和悟性,当然还得经过艰苦的努力。说实话,书的这部分少勇反反复复看了数遍,确实学会了很多知识。我的建议是,在阅读这部分时,切记要细致但不要钻牛角尖,否则可能一时半会儿真的就绕在里边出不来。还有,由于DCOM的安全性是建立在NT安全性基础之上的,很多地方涉及到了分布式系统的安全策略,因此您最好具有这方面的基础知识,如果没有,看不懂是很正常的事。 通过对本书的前两部分的学习,您已经对COM的基本原理和扩展部分有了一个比较全面的认识,就象盖房子,您已经打好了坚实的地基并垒起了围墙,实在可喜可贺!但这还很不够,因为我们学一项技术的目的就是如何来很好地用它。因此,就必须进行第三部分的学习,在这里您将学到既具有COM优点又实用的技术,作者将教您如何给房子盖上房顶。 书的第十一章讲述了自动化对象。自动化的概念最早出现在OLE2中,当时叫做OLE自动化。后来这个概念被COM所吸收,称为自动化。现在各式各样的Control中都引入了自动化的概念,Word和Execl也支持自动化。事情往往就是这样,一个概念应用的越广就越难给其下一个恰到好处的定义。自动化便是这样,各种资料上形形色色的描述总是让人抓不住重点。《Inside COM》中关于自动化的论述也很不能让人满意,而《COM原理与应用》算是弥补了这方面的缺憾。 我们知道,COM实质上是定义了一种客户与服务器的通信方式,而这种通信是通过接口来完成的。当我们用C++来写客户程序的时候,一切都是那么美好,通过CoCreateInstance和QueryInterface将得到一个接口指针,通过这个接口指针就可以调用相应的函数了。请注意,这一切都是通过指针来进行的。可是当我们用Visual Basic写客户程序时,情况就不那么美好了,原因只有一个:Visual Basic是弱类型编程语言,它对数据类型的描述能力非常有限。因此,我们必须提出一个让解释性语言也能够访问组件的方案,这个方案就被称之为自动化。一个自动化服务器实际上就是一个实现了IDispatch接口的COM组件,而一个自动化控制器则是一个通过IDispatch接口同自动化服务器进行通信的COM客户。 在本章中,作者对IDispatch接口和相关数据类型、Invoke函数的实现、双接口以及迟绑定和早绑定、自动化对象的编程都做了详细的论述并提供了很好的例子,是本书的又一闪光点。 第十二章讲述ActiveX控制,在本章中,作者不但详细论述了ActiveX控制的基本理论,还对如何在Internet环境下应用ActiveX控制作了深入讨论。因此,本章对于具有一些这方面基础知识的读者来说,是加深理解、迅速提高的不可多得的资料。由于作者为了节约篇幅,在这一部分作了一些删节,有的地方读起来可能会产生一定的跳跃感,不过无碍大局,因为目前介绍ActiveX基础的资料很多。由于作者对MFC很熟悉,这一章的例子仍然用MFC来编写并进行了深入的剖析,这对于C++的爱好者实为一个提高的好机会。 COM作为一种软件模型,不仅提供了程序与程序之间通信的标准,而且改变了传统的程序设计方法。因此,COM的主要贡献在于对程序设计方法的变革。书的第十三章讲述了基于COM的程序设计,在这一章里,作者对面向对象的程序设计方法作了一定分析并与组件化程序设计作了比较,进而讨论了MTS,并对多层应用软件结构和基于COM的Web应用作了一定介绍,使读者可以对组件化程序设计产生一个全面的认识。 虽然MTS出台已经有一段时间了,但是真正用的人还不多,许多探索仅仅停留在理论上,种种原因使MTS的优越性没有被广大的Windows程序员所认识。不过随着Windows2000的出台和COM+的发布,这种情况很快就会有所改变。COM+是COM、DCOM、MTS的集成,它通过操作系统的各种支持,把组件软件提升到应用层,而所有的底层细节留给了操作系统。书的最后一章介绍了COM+,对于大家开拓眼界、理解Windows2000所提供的服务具有非常重大的现实意义。 《COM原理与应用》是潘爱民先生的力作,我认为其意义有二:其一,本书在前后的一致性和名词的把握上都很不错,读者得到的是“地道”的COM中文书籍,与翻译作品有显著的不同。其二,国内作家能写出如此深入(甚至超过了美国的作家)的作品,对我们来说,的确是一件令人欢欣鼓舞的事情,但愿在不久的将来,这样的书籍会越来越多。 当然,《COM原理与应用》并不是十全十美的,对于所涉及到的知识来说,有些部分的论述略显单薄,尤其缺乏对于书中例子的剖析,也许是作者考虑压缩篇幅的原因吧。少勇认为,不是所有的人都能消化“浓缩”后的知识。 通过以上论述,相信各位对这几本COM书籍已经有了一定的认识,大家可以根据自己的实际情况选择阅读。 新千年、新气象,少勇特书写了一幅对联,与大家共勉: 上联:新千年观日月辉映天地 下联:数万载论风流指点离骚 横批:志在今朝 用VC进行COM编程所必须掌握的理论知识用VC进行COM编程所必须掌握的理论知识-- lostall 这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避免编程细节。完全是根据 我自己的学习体会写的,其中若有技术上的错误之处,请大家多多指正。 1。为什么用COM 2。用VC进行COM编程,必需要掌握哪些COM理论知识 一、为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM,编程,目 标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。 结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功 能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去 做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就 是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。 下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。我们知道整 个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠 着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界 中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这 个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的 属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种 稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念 它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这 么想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而 只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因 为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事 物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改 变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我 们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来方法 只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小 的变化也可能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭 积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是 类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的重用是基于源码的方 式,这是它的重大缺陷。首先它限制了编程语言,你的类库总是用一种语言写的吧,那你就不能 拿到别的语言里用了。其次你每次都必须重新编译,只有编译了才能与你自己的代码结合在一起 生成可执行文件。在开发时这倒没什么,关键在于开发完成后,你的EXE都已经生成好了,如果 这时侯你的类库提供厂商告诉你他们又做好了一个新的类库,功能更强大速度更快,而你为之心 动又想把这新版的类库用到你自己的程序中,那你就必须重新编译、重新调试!这离我们理想的 积木式软件构造方法还有一定差距,在我们的设想里希望把一个模块拿出来再换一个新的模块是 非常方便的事,可是现在不但要重新编译,还要冒着很大的风险,因为你可能要重新改变你自己 的代码。另一种重用方式很自然地就想到了是DLL的方式。Windows里到处是DLL,它是Windows 的基础,但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一 个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译 器对C++函数的名称修饰不兼容问题。对于C++函数,编译器要根据函数的参数信息为它生成 修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern "C";来强调使用标准的C函数特性,关闭 修饰功能,但这样也丧失了C++的重载多态性功能。(3)路径问题。放在自己的目录下面,别人 的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方 甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐 式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑 在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可 能已经发生了改变。DLL的缺点就是COM的优点。首先我们要先把握住一点,COM和DLL一样都是 基于二进制的代码重用,所以它不存在类库重用时的问题。另一个关键点是,COM本身也是DLL, 既使是ActiveX控件.ocx它实际上也是DLL,所以说DLL在还是有重用上有很大的优势,只不过我们 通过制订复杂的COM协议,通COM本身的机制改变了重用的方法,以一种新的方法来利用DLL,来 克服DLL本身所固有的缺陷,从而实现更高一级的重用方法。COM没有重名问题,因为根本不是通 过函数名来调用函数,而是通过虚函数表,自然也不会有函数名修饰的问题。路径问题也不复存 在,因为是通过查注册表来找组件的,放在什么地方都可以,即使在别的机器上也可以。也不用 考虑和EXE的依赖关系了,它们二者之间是松散的结合在一起,可以轻松的换上组件的一个新版 本,而应用程序混然不觉。 二、用VC进行COM编程,必须要掌握哪些COM理论知识 我见过很多人学COM,看完一本书后觉得对COM的原理比较了解了,COM也不过如此,可是就 是不知道该怎么编程序,我自己也有这种情况,我经历了这样的阶段走过来的。要学COM的基本 原理,我推荐的书是《COM技术内幕》。但仅看这样的书是远远不够的,我们最终的目的是要学 会怎么用COM去编程序,而不是拼命的研究COM本身的机制。所以我个人觉得对COM的基本原理不 需要花大量的时间去追根问底,没有必要,是吃力不讨好的事。其实我们只需要掌握几个关键概 念就够了。这里我列出了一些我自己认为是用VC编程所必需掌握的几个关键概念。(这里所说的 均是用C语言条件下的COM编程方式) (1) COM组件实际上是一个C++类,而接口都是纯虚类。组件从接口派生而来 我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西: class IObject { public: virtual Function1(...) = 0; virtual Function2(...) = 0; .... }; class MyObject : public IObject { public: virtual Function1(...){...} virtual Function2(...){...} .... }; 看清楚了吗?IObject就是我们常说的接口,MyObject就是所谓的COM组件。切记切记接口都 纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。而COM组件就是从这些纯虚 类继承下来的派生类,它实现了这些虚函数,仅此而已。从上面也可以看出,COM组件是以 C++为基础的,特别重要的是虚函数和多态性的概念,COM中所有函数都是虚函数,都必须通 过虚函数表VTable来调用,这一点是无比重要的,必需时刻牢记在心。为了让大家确切了解 一下虚函数表是什么样子,从COM+技术内幕中COPY了下面这个示例图: (2) COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不 可改变的。QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父 类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。引用计数也 是COM中的一个非常重要的概念。大体上简单的说来可以这么理解,COM组件是个DLL,当客 户程序要用它时就要把它装到内存里。另一方面,一个组件也不是只给你一个人用的,可能 会有很多个程序同时都要用到它。但实际上DLL只装载了一次,即内存中只有一个COM组件, 那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用, 所以只能由COM组件自己来负责。所以出现了引用计数的概念,COM维持一个计数,记录当前 有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放 它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。 引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各种的类库里已经基本上 把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们 只需在适当的时侯调用Release。至少有两个时侯要记住调用Release,第一个是调用了 QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。 IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也 不需要自己来实现它们。 IClassFactory的作用是创建COM组件。我们已经知道COM组件实际上就是一个类,那我们平 常是怎么实例化一个类对象的?是用‘new’命令!很简单吧,COM组件也一样如此。但是谁 来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组 件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表 着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一 下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一 个单独的对象,这个对象就是类厂。每个组件都必须有一个与之相关的类厂,这个类厂知道 怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂 创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有 用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操 作都交给类厂对象去做了。IClassFactory最重要的一个函数就是CreateInstance,顾名思议 就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有 某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多 的控制机会,而VB给我们这样的机会则是太少太少了。 IDispatch叫做调度接口。它的作用何在呢?这个世上除了C++还有很多别的语言,比如VB、 VJ、VBScript、JavaScript等等。可以这么说,如果这世上没有这么多乱七八糟的语言,那 就不会有IDispatch。:-) 我们知道COM组件是C++类,是靠虚函数表来调用函数的,对于VC来 说毫无问题,这本来就是针对C++而设计的,以前VB不行,现在VB也可以用指针了,也可以 通过VTable来调用函数了,VJ也可以,但还是有些语言不行,那就是脚本语言,典型的如 VBScript、JavaScript。不行的原因在于它们并不支持指针,连指针都不能用还怎么用多态 性啊,还怎么调这些虚函数啊。唉,没办法,也不能置这些脚本语言于不顾吧,现在网页上 用的都是这些脚本语言,而分布式应用也是COM组件的一个主要市场,它不得不被这些脚本 语言所调用,既然虚函数表的方式行不通,我们只能另寻他法了。时势造英雄,IDispatch应 运而生。:-) 调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的 时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数,仅 此而已。当然实际的过程远比这复杂,当给一个编号就能让别人知道怎么调用一个函数那不 是天方夜潭吗,你总得让别人知道你要调用的函数要带什么参数,参数类型什么以及返回什 东西吧,而要以一种统一的方式来处理这些问题是件很头疼的事。IDispatch接口的主要函数 是Invoke,客户程序都调用它,然后Invoke再调用相应的函数,如果看一看MS的类库里实现 Invoke的代码就会惊叹它实现的复杂了,因为你必须考虑各种参数类型的情况,所幸我们不 需要自己来做这件事,而且可能永远也没这样的机会。:-) (3) dispinterface接口、Dual接口以及Custom接口 这一小节放在这里似乎不太合适,因为这是在ATL编程时用到的术语。我在这里主要是想谈 一下自动化接口的好处及缺点,用这三个术语来解释可能会更好一些,而且以后迟早会遇上 它们,我将以一种通俗的方式来解释它们,可能并非那么精确,就好象用伪代码来描述算法 一样。-:) 所谓的自动化接口就是用IDispatch实现的接口。我们已经讲解过IDispatch的作用了,它的好 处就是脚本语言象VBScript、 JavaScript也能用COM组件了,从而基本上做到了与语言无关 它的缺点主要有两个,第一个就是速度慢效率低。这是显而易见的,通过虚函数表一下子就 可以调用函数了,而通过Invoke则等于中间转了道手续,尤其是需要把函数参数转换成一种 规范的格式才去调用函数,耽误了很多时间。所以一般若非是迫不得已我们都想用VTable的 方式调用函数以获得高效率。第二个缺点就是只能使用规定好的所谓的自动化数据类型。如 果不用IDispatch我们可以想用什么数据类型就用什么类型,VC会自动给我们生成相应的调度 代码。而用自动化接口就不行了,因为Invoke的实现代码是VC事先写好的,而它不能事先预 料到我们要用到的所有类型,它只能根据一些常用的数据类型来写它的处理代码,而且它也 要考虑不同语言之间的数据类型转换问题。所以VC自动化接口生成的调度代码只适用于它所 规定好的那些数据类型,当然这些数据类型已经足够丰富了,但不能满足自定义数据结构的 要求。你也可以自己写调度代码来处理你的自定义数据结构,但这并不是一件容易的事。 考虑到IDispatch的种种缺点(它还有一个缺点,就是使用麻烦,:-) )现在一般都推荐写双接 口组件,称为dual接口,实际上就是从IDispatch继承的接口。我们知道任何接口都必须从 IUnknown继承,IDispatch接口也不例外。那从IDispatch继承的接口实际上就等于有两个基 类,一个是IUnknown,一个是IDispatch,所以它可以以两种方式来调用组件,可以通过 IUnknown用虚函数表的方式调用接口方法,也可以通过IDispatch::Invoke自动化调度来调用 这就有了很大的灵活性,这个组件既可以用于C++的环境也可以用于脚本语言中,同时满足 了各方面的需要。 相对比的,dispinterface是一种纯粹的自动化接口,可以简单的就把它看作是IDispatch接口 (虽然它实际上不是的),这种接口就只能通过自动化的方式来调用,COM组件的事件一般都 用的是这种形式的接口。 Custom接口就是从IUnknown接口派生的类,显然它就只能用虚函数表的方式来调用接口了 (4) COM组件有三种,进程内、本地、远程。对于后两者情况必须调度接口指针及函数参数。 COM是一个DLL,它有三种运行模式。它可以是进程内的,即和调用者在同一个进程内,也可 以和调用者在同一个机器上但在不同的进程内,还可以根本就和调用者在两台机器上。 这里有一个根本点需要牢记,就是COM组件它只是一个DLL,它自己是运行不起来的,必须 有一个进程象父亲般照顾它才行,即COM组件必须在一个进程内.那谁充当看护人的责任呢? 先说说调度的问题。调度是个复杂的问题,以我的知识还讲不清楚这个问题,我只是一般 性的谈谈几个最基本的概念。我们知道对于WIN32程序,每个进程都拥有4GB的虚拟地址空 间,每个进程都有其各自的编址,同一个数据块在不同的进程里的编址很可能就是不一样 的,所以存在着进程间的地址转换问题。这就是调度问题。对于本地和远程进程来说,DLL 和客户程序在不同的编址空间,所以要传递接口指针到客户程序必须要经过调度。Windows 已经提供了现成的调度函数,就不需要我们自己来做这个复杂的事情了。对远程组件来说 函数的参数传递是另外一种调度。DCOM是以RPC为基础的,要在网络间传递数据必须遵守标 准的网上数据传输协议,数据传递前要先打包,传递到目的地后要解包,这个过程就是调 度,这个过程很复杂,不过Windows已经把一切都给我们做好了,一般情况下我们不需要自 己来编写调度DLL。 我们刚说过一个COM组件必须在一个进程内。对于本地模式的组件一般是以EXE的形式出现, 所以它本身就已经是一个进程。对于远程DLL,我们必须找一个进程,这个进程必须包含了 调度代码以实现基本的调度。这个进程就是dllhost.exe。这是COM默认的DLL代理。实际上在 分布式应用中,我们应该用MTS来作为DLL代理,因为MTS有着很强大的功能,是专门的用于 管理分布式DLL组件的工具。 调度离我们很近又似乎很远,我们编程时很少关注到它,这也是COM的一个优点之一,既平 台无关性,无论你是远程的、本地的还是进程内的,编程是一样的,一切细节都由COM自己 处理好了,所以我们也不用深究这个问题,只要有个概念就可以了,当然如果你对调度有 自己特殊的要求就需要深入了解调度的整个过程了,这里推荐一本《COM+技术内幕》,这 绝对是一本讲调度的好书。 (5) COM组件的核心是IDL。 我们希望软件是一块块拼装出来的,但不可能是没有规定的胡乱拼接,总是要遵守一定的 标准,各个模块之间如何才能亲密无间的合作,必须要事先共同制订好它们之间交互的规 范,这个规范就是接口。我们知道接口实际上都是纯虚类,它里面定义好了很多的纯虚函 数,等着某个组件去实现它,这个接口就是两个完全不相关的模块能够组合在一起的关键 试想一下如果我们是一个应用软件厂商,我们的软件中需要用到某个模块,我们没有时间 自己开发,所以我们想到市场上找一找看有没有这样的模块,我们怎么去找呢?也许我们 需要的这个模块在业界已经有了标准,已经有人制订好了标准的接口,有很多组件工具厂 商已经在自己的组件中实现了这个接口,那我们寻找的目标就是这些已经实现了接口的组 件,我们不关心组件从哪来,它有什么其它的功能,我们只关心它是否很好的实现了我们 制订好的接口。这种接口可能是业界的标准,也可能只是你和几个厂商之间内部制订的协 议,但总之它是一个标准,是你的软件和别人的模块能够组合在一起的基础,是COM组件 通信的标准。 COM具有语言无关性,它可以用任何语言编写,也可以在任何语言平台上被调用。但至今为 止我们一直是以C++的环境中谈COM,那它的语言无关性是怎么体现出来的呢?或者换句话 说,我们怎样才能以语言无关的方式来定义接口呢?前面我们是直接用纯虚类的方式定义 的,但显然是不行的,除了C++谁还认它呢?正是出于这种考虑,微软决定采用IDL来定义 接口。说白了,IDL实际上就是一种大家都认识的语言,用它来定义接口,不论放到哪个 语言平台上都认识它。我们可以想象一下理想的标准的组件模式,我们总是从IDL开始, 先用IDL制订好各个接口,然后把实现接口的任务分配不同的人,有的人可能善长用VC, 有的人可能善长用VB,这没关系,作为项目负责人我不关心这些,我只关心你最后把DLL 拿给我。这是一种多么好的开发模式,可以用任何语言来开发,也可以用任何语言也欣赏 你的开发成果。 (6) COM组件的运行机制,即COM是怎么跑起来的。 这部分我们将构造一个创建COM组件的最小框架结构,然后看一看其内部处理流程是怎样的 IUnknown *pUnk=NULL; IObject *pObject=NULL; CoInitialize(NULL); CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown, (void**)&pUnk); pUnk->QueryInterface(IID_IOjbect, (void**)&pObject); pUnk->Release(); pObject->Func(); pObject->Release(); CoUninitialize(); 这就是一个典型的创建COM组件的框架,不过我的兴趣在CoCreateInstance身上,让我们 来看看它内部做了一些什么事情。以下是它内部实现的一个伪代码: CoCreateInstance(....) { ....... IClassFactory *pClassFactory=NULL; CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory); pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk); pClassFactory->Release(); ........ } 这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。 继续深入一步,看看CoGetClassObject的内部伪码: CoGetClassObject(.....) { //通过查注册表CLSID_Object,得知组件DLL的位置、文件名 //装入DLL库 //使用函数GetProcAddress(...)得到DLL库中函数DllGetClassObject的函数指针。 //调用DllGetClassObject } DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件. 下面是DllGetClassObject的伪码: DllGetClassObject(...) { ...... CFactory* pFactory= new CFactory; //类厂对象 pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory); //查询IClassFactory指针 pFactory->Release(); ...... } CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance 的伪码: CFactory::CreateInstance(.....) { ........... CObject *pObject = new CObject; //组件对象 pObject->QueryInterface(IID_IUnknown, (void**)&pUnk); pObject->Release(); ........... } 下图是从COM+技术内幕中COPY来的一个例图,从图中可以清楚的看到CoCreateInstance的整个 流程。 (7) 一个典型的自注册的COM DLL所必有的四个函数 DllGetClassObject:用于获得类厂指针 DllRegisterServer:注册一些必要的信息到注册表中 DllUnregisterServer:卸载注册信息 DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL DLL还有一个函数是DllMain,这个函数在COM中并不要求一定要实现它,但是在VC生成的组 件中自动都包含了它,它的作用主要是得到一个全局的实例对象。 (8) 注册表在COM中的重要作用 首先要知道GUID的概念,COM中所有的类、接口、类型库都用GUID来唯一标识,GUID是一 个128位的字串,根据特制算法生成的GUID可以保证是全世界唯一的。 COM组件的创建,查询接口都是通过注册表进行的。有了注册表,应用程序就不需要知道 组件的DLL文件名、位置,只需要根据CLSID查就可以了。当版本升级的时侯,只要改一下 注册表信息就可以神不知鬼不觉的转到新版本的DLL。 本文是本人一时兴起的涂鸭之作,讲得并不是很全面,还有很多有用的体会没写出来,以后 如果有时间有兴趣再写出来。希望这篇文章能给大家带来一点用处,那我一晚上的辛苦就没有白 费了。-:) 30 juni 求职面试自我介绍一分钟一分钟的自我介绍,犹如商品广告,在短短60秒内,针对“客户”的需要,将自己最美好的一面,毫无保留地表现出来,不但要令对方留下深刻的印象,还要即时引发起“购买欲”。 自我认识想一矢中的,首先必须知道你能带给公司什么好处。当然不能空口讲白话,必须有事实加以证明。 最理想就是能够“展示”过去的成就。例如你曾为以往的公司设计网页,并得过奖项或赞扬。当然,这些例子都必须与现在公司的业务性质有关。 职位愈高,自我认识就愈重要,应将个人的成败得失,尽录在日记中。这样,就可以时刻都清楚自己的弱点与强项。 投其所好清楚自己的强项后,便可以开始预备自我介绍的内容:包括工作模式、优点、技能,突出成就、专业知识、学术背景等。 好处众多,但只有短短一分钟,所以一切还是与该公司有关的好。如果是一间电脑软件公司,应说些电脑软件的话题;如是一间金融财务公司,便可跟他说钱的事,总之投其所好。 但有一点必须紧记:话题所到之处,必须突出自己对该公司做出的贡献,如增加营业额、减低成本、发掘新市场等。 铺排次序内容的次序亦极重要,是否能紧握听众的注意力,全在于事件的编排方式。所以排在头位的,应是你最想他记得的事情。而这些事情,一般都是你最得意之作。与此同时,可呈上一些有关的作品或记录增加印象分。 身体语言不管内容如何精彩绝伦,若没有美丽的包装,还是不成的。所以在自我介绍当中,必须留意自己在各方面的表现,尤其是声线。切忌以背诵朗读的口吻介绍自己。最好事前找些朋友作练习对象,尽量令声线听来流畅自然,充满自信。 身体语言也是重要的一环,尤其是眼神接触。这不但令听众专心,也可表现自信。 曾有一项报告指出,日常的沟通,非语言性的占了70%。所以,若想面试成功,便应紧记注意一下你的身体语言。 企业面试常见问题1、简单介绍一下你自己(尽量把回答控制在两分钟内) 6、你认为这个职务有哪些技能和专业知识是最关键的? 15、假如我们决定聘请你,你希望在这个职位上得到多少薪水? 19、你的强项是什么?你的弱点呢? 怎样向接待你的人提问题?在求职谈话中,并不是光让求职单位了解自己并让求职单位提问,而且还要让求职单位介绍他们的情况,这就需要在求职谈话时向接侍你的人提问题。问题也有一个技术技巧问题。提得好,会增加人家对你的好感;提得不好,会让人家觉得你大幼稚,可笑,不但不能增加好感,有时甚至会产生反感。那么在求职时,应该怎样向接待你的人提问题呢? 第一,先要弄清接待你的人的职务,是一般工作人员,还是负责人,是哪一级的负责人。 要视接待人的职务来提问题。不要不管接待的是什么人、什么问题都提。比如你是一个大学毕业生,想到高等学校某系当教师,想了解求职单位共有多少人,年龄、职称结构如何,就不要与一般教师谈话时提问,而要向单位负责人提问。 第二、所提问题的具体内容都要与你能否到求职单位工作有关。一般说来,与求职有关的问题主要有: 1.该单位的组织结构、人员年龄、职称结构、该单位成立时间、发展壮大状况等一般性问题; 2.该单位职业劳动性质、任务、岗位状况; 3.该单位的用工方式、内部分配制度、管理方式; 4.该单位在同行业中的地位、发展前景; 5.该单位近期所需人员的知识结构,素质结构; 6.该单位的经济效益、社会效益、管理状况等等。 第三、要注意选择提问题的时间,就是要把不同的问题安排在谈话进程中的不同阶段提出。 有的问题可在谈话一开始提出,有的可在谈话进程中提,有的可在快结束时再提。不要毫无逻辑性的乱提,更不可颠三倒四反反复复提那么几个问题。因此,,在谈话之前,要把所要提的问题一一列出来,自己排排队,按照谈话进程阶段编出序号,反复看几遍,以便在谈话时头脑清醒,知道提问的顺序。 第四、不要询问接待你的人本身有关的问题。 在求职谈话正在进行中,不要询问接待你的人本身有关的问题。比如,不要问人家什么地方人,什么专业毕业,结婚了没有,孩子多大了等等。 当然,这些话不是不能问、不该问,而是要恰当安排提问题的时间。如果在求职谈话开始之前或结束之后,有充裕的时间,可以很友好地问问人家的生活、工作状况。这样,会打破那种生疏、冷漠的局面,可以缩短谈话者之间的距离、增加亲切感,使谈话具有人情味。 第五、提问题的方式、语气。 有些问题,可以直接了当地提出来,如贵单位人员结构,贵单位岗位结构等;有些问题,则不可直截了当地提出,而要婉转、含蓄一些。 如想了解求职单位职工收入情况和自己去了之后每月会有多少收入等问题,就不要直接问人家“你每月收入多少?我来了之后每月能收入多少?”而应该婉转的问人家“贵单位有什么奖惩条例、规定”,“贵单位实行什么样的分配制度”等。因为这些问题清楚了,自己对照一下就清楚可能会有多少收入。 另外,在询问时,一定要注意口气,要给人一种诚挚、谦逊的感觉,不能给人一种质问、傲慢的感觉。 比如你到一个单位求职,谈了三次,对方一直没有明确表示录用还是不录用,但也没完全拒绝,你在问对方究竟是什么态度时,不要这样问:“你们为什么老定不下来?”而应该这样问:“你们还有什么不了解?我希望能早一点能知道您们录用不录用,您看我什么时候再来合适?当然,也不要为我这件事影响你们其它工作。我过一周再来可以吗?”前面的问话,是一种质问的口气,会引起人家的反感。后一种问话虽然是告诉对方应尽快研究,但是用一种商量的语气,不会有掼对方的尊严。 第六、有明确答案的问题可提,不要提模棱两可、似是而非的问题。特别是提与职业、事业有关的问题时,所提问题一定要确切,不要不懂装懂、提出幼稚可笑的问题。因为从提问题中可以看出提问者的知识水平、思维方式、个人利益价值观等。 由于谈话的对象、时间、地点、目的不同,提问题应该注意的问题不可能一一列举,总之,择业者要重视提问题技术、技巧的学习和运用,这对选择到什么职业单位影响极大,不可马马虎虎对待。 面试时单位考察的主要方面求职者的仪表和姿态是否符合本工作要求。 求职者的自我表现能力(包括表情、语言、自信)。 求职者的态度及工作抱负与本单位的工作目标是否一致? 求职者的气质、性格类型是否符合本项工作的要求。 求职者的工作意愿是否能够在本单位得到满足? 求职者的专长能否符合所聘用职位的工作要求? 求职者的工作经历是否符合所聘用职位的要求? 求职者所要求的待遇及其工作条件是否适合本单位所能提供的条件? 求职者的潜能是否在本单位有继续发展的可能。 求职者的口头表达能力如何? 求职者的综合分析能力如何? 求职者的随机应变能力如何? 求职者的想象力和创造力如何? 求职者的工作热情和事业心如何? 求职者是否有足够的精力担当此项工作? 求职者所表现出来的综合素质是否足以担当所要任命的工作职务? 夺回面试的主动权无论你是一个多么高明的求职老手,对于自己“钟情”单位的面试,虽表面能从容不迫、侃侃而答,但内心仍是步步为营,小心谨慎。其实,只要掌握一些看似微不足道的“细节”,你就能潇洒自如,维持面试的良好气氛。 1 善于打破沉默。面试开始时,应试者不善“破冰”(英文直译,即打破沉默),而等待面试官打开话匣。面试中,应试者又出于种种顾虑,不愿主动说话,结果使面试出现冷场。 即便能勉强打破沉默,语音语调亦极其生硬,使场面更显尴尬。实际上,无论是面试前或面试中,面试者主动致意与交谈,会留给面试官热情和善于与人交谈的良好印象。 2保持积极应答状态。面试官常常会提出或触及一些让应试者难为情的事情。很多人对此面红耳赤,或躲躲闪闪,或撒谎敷衍,而不是诚实作答、正面解释。比方说面试官问:你为什么5年中换了3次工作?有人可能就会大谈工作如何困难,上级不支持等,而不是告诉面试官:从事不同的工作,丰富了我的知识面,自己也因此学到了许多,也成熟了很多。 3善于向面试官提问。有些人在不该提问时提问,如面试中打断面试官谈话而提问。也有些人面试前对提问没有足够准备,轮到有提问机会时不知说什么好。而事实上,一个好的提问,胜过简历中的无数笔墨,会让面试官刮目相看。 4勿与面试官过分“套近乎”。具备一定专业素养的面试官是忌讳与应试者套近乎的,因为面试中双方关系过于随便或过于紧张都会影响面试官的评判。过分“套近乎”亦会在客观上妨碍应试者在短短的面试时间内,作好专业经验与技能的陈述。聪明的应试者可以例举一至两件有根有据的事情来赞扬招聘单位,从而表现出您对这家公司的兴趣。 5 面试结束巧妙收场。很多求职应试者面试结束时,因成功的兴奋,或因失败的恐惧,会语无伦次,手足无措。其实,面试结束时,应试者不妨表达您对应聘职位的理解;充满热情地告诉面试者您对此职位感兴趣,并询问下一步是什么;面带微笑和面试官握手并谢谢面试官的接待及对您的考虑。 英文面试过关三招介绍最忌面面俱到 尽管有人认为面试时做自我介绍不流行了,但是准备一份正常语速下3分钟长度的英文自我简介是必要的。首先,自我简介是自我介绍的总纲,是保证你在面对任何问题时都能够应对自如的前提;其次,也是有备无患。 如果试图在短短几分钟内吸引面试官的注意力,你的简介当然要是浓缩的精品。所以,前奏一般用一句话陈述自己的基本特征即可。然后迅速进入正题,或选择自己最引以为傲的经历叙述,或介绍自己的长处。面试官一般会承接你的自我介绍发问,所以在做自我介绍时最好不要提特别难于讲清楚的事情和比较抽象的概念,因为你的英文水平只够应付普通会话,更何况身处高度紧张的面试氛围中,哪里还能够应对自如。简介不需要面面俱到,因为在你曾经提交的资料中,已有详细的介绍,所以力求在面试中突出重点。 回答语速切莫过快 很多应聘者认为只要在外国面试官前把英文说“溜”即可,其他的无所谓,于是语速狂飙。我们经常看到这种情形,在你口吐莲花之后,满场静寂,老外目瞪口呆,因为他们没有听懂你赶火车似的中式英文。其实,英文面试的第一目的是让国外主管了解你,甚至对你感兴趣,最重要的是展示你的综合素质,绝非单单的语言能力,所以应该首先力求表达清晰。另外语速过快容易给人不自信、不稳重的错觉。剑桥大学的一项调查显示,语速快一般体现具备两种不同特质的人,一种是思维和语言反应能力强且协调的人,一种是处事急躁的人,万一人家把你理解为第二种怎么办? 自由讨论应当直白 用简单直白的语言表现最具魅力的自我,才是英文面试的至高境界。习惯于堆砌华丽词藻的很多人恨不得在面试中用大气磅礴的英文演讲征服面试官,其实又犯了舍本逐末的错误。不要不屑于用therebe句型,不要不屑于用第一人称,不要想着那些一辈子也用不上几次的虚拟语气、倒装句和长词冗句,如果你能保证说英文如行云流水那么你尽情用,但万一紧张得忘了词怎么办?万一面试官和你展开辩论怎么办?用平实的语言直切正题是最讨巧的方式。 如果你凭实力进入了freetalk阶段,接下来要做的就是坦率的与面试官讨论大到企业未来,小到穿着打扮的话题,当然坦率也要聪明。那时候面试官有可能思维如野马,你很难把握他所关注的你身上的特质,你也无法预知他会问你些什么,那么以上这几点仍然是唯一可遵循的规律。 面试如何介绍自己 张小姐和杨小姐都是刚毕业的学生,学的都是英语专业,学习成绩都很突出,二人同时应聘一家独资公司的高级秘书职位。人事经理看了简历以后,难以取舍。于是通知两人面试,考官让她们分别做一个自我介绍。 张小姐说:"我今年22岁,刚从某大学毕业,所学专业是英语。浙江人。父母均是高级工程师。我爱好音乐和旅游。我性格开朗,做事一丝不苟。很希望到贵公司工作。" 杨小姐介绍说:"关于我的情况简历上都介绍得比较详细了。在这我强调两点:我的英语口语不错,曾利用假期在旅行社做过导游,带过欧美团。再者,我的文笔较好,曾在报刊上发表过6篇文章。如果您有兴趣可以过目。" 最后,人事经理录用了杨小姐。 当应聘到外企或其他用人单位时,求职者往往最先被问及的问题就是"请先介绍介绍你自己"。这个问题看似简单,但求职者一定要慎重对待,它是你突出优势和特长,展现综合素质的好机会。回答得好,会给人留下良好的第一印象。 回答这类问题,要掌握几点原则: --开门见山,简明扼要,一般最好不要超过三分钟。 --实事求是,不可吹得天花乱坠。 --突出长处,但也不隐瞒短处。 --所突出的长处要与申请的职位有关。 --善于用具体生动的实例来证明自已,说明问题,不要泛泛而谈。 --说完之后,要问考官还想知道关于自己的什么事情。 为了表达更流畅,面试前应做些准备。而且由于主考喜好不同,要求自我介绍的时间不等。所以最明智的做法应是准备一分钟、三分钟、五分钟的介绍稿,以便面试时随时调整。 一分钟的介绍以基本情况为主,包括姓名、学历、专业、家庭状况等,注意表述清晰;三分钟的介绍除了基本情况之外,还可加上工作动机、主要优点缺点等;五分钟介绍,还可以谈谈自己的人生观,说些生活趣事,举例说明自己的优点等。 |
||||||
|
|