2007年7月26日星期四

ATL8的COM服务器实现(一)

在现阶段,ATL仍然是实现COM组件的一个重要手段。在几年的发展中,ATL出现了两个重要的版本-ATL3和ATL8。虽然ATL8已经出来好几年,但是由于我一直重用着以前用ATL3开发的老代码,因此对ATL8没有什么太多的研究。这次借着新项目的机会,能够正式使用到Visual Studio 8进行开发,我也因此得以好好的研究了一下ATL8的实现。虽然现在是.net大行其道的时代,但我这个守旧的人还是希望能记录下这个快要被遗忘的技术的研究心得。


COM服务器的种类

Win32版本的COM有两种服务器

  • inporc server --进程中服务器(动态链接库,DLL等形式)
  • out-of-proc server --进程外服务器(exe程序,进程外是对客户进程而言)
其中out-of-proc server有几个特例,一个是DCOM,可以叫做Remote Server,一种是系统服务,也就是service。

对于InProc-Server,我没有过多的研究其在ATL8中的实现,毕竟相当简单。这里主要对out-of-proc Server的实现进行研究。研究对象也是一般的EXE程序,而不是service。

COM服务器的职责

COM服务器有三个基本职责
  • 注册和反注册服务器
  • 暴露类厂(实现IClassFactory),使SCM能够访问
  • 服务器生命周期管理
进程外服务器简述

进程外服务器就是一个exe程序。如果在命令行上面指定 regserver或unregserver就能要求该服务器进行注册和反注册。注册成功就会在注册表中出现该服务器所包含的所有接口的ProgID和ClSID。ATL实现了这个简单的功能。

ATL同样是调用标准COM辅助函数CoRegisterClassObject把类厂和每个类的IUnknown暴露给SCM,这样客户就可以通过SCM来使用组件提供的接口。在Server结束生命周期之前,调用
CoRevokeClassObject把组件从SCM中注销。

对于生命周期管理,由于是exe程序,所以它可以自己管理自己的生命周期。当服务器检测到已经没有任何客户在引用它内部对象时,它可以选择是否退出运行(ATL中默认是exe退出运行)。


服务器与COM对象

一个服务器在程序中是什么呢?事实上没有具体的对象可以代表它。ATL使用OO编程,因此为服务器定义了一个类,其最高层父类是CAtlModule。它是个全局变量,因此它有着和exe程序本身相同的生命周期,因此由他管理COM对象再合理不过。

一个COM对象可以通过CoCreateInstance创建。它有自己的类厂,该类厂实现IClassFactory接口。
注:有些对象是不能被CoCreateInstance创建的,只能通过其他对象间接的创建。

那么服务器如何与COM对象打交道呢?
ATL从一开始的版本就提供了一个叫Object Map的结构来存放服务器内COM对象的信息。CAtlModule(简单起见,就把它当作服务器吧,这样容易理解一点)利用Object Map来做要求每个类自己注册和反注册,创建类厂,提供一些辅助函数来进行初始化和结束前的工作。

下一章 详细介绍Object Map




2007年7月22日星期日

BENQ海湾键盘,让我对你说爱还是恨

这已经是我第二个海湾键盘了。黑色的键盘,非常酷,不宽,占地小,有质感。最重要的是这个键盘的手感很好,很像ThinkPad T系列键盘的手感。打上去戚戚嚓嚓,有点像以前机械键盘的感觉,但没有那么坚硬,反而很有弹性。让我在两年前第一次看到这款键盘的时候就毫不犹豫地在新蛋上买了下来。

有了这个键盘,我在打字的时候常常停下来感叹一番,国产的键盘也不错阿,谁说国产的东西不行的。

但是没想到这款键盘还是个扶不起的阿斗,一年也没有到,这个键盘边缘的键位上的字已经磨光了,然后开始成皮成批的键位失灵。那时候我有点气愤,想想以前的无名键盘用了3年都没有什么问题。这个100多块的键盘竟然才用了1年就报废了。

我今年年初拿着键盘去太平洋三期准备保修的,结果找不到发票了,本来想去磨磨看的,结果鬼使神差得又买了一个一模一样的海湾键盘回来。当戚戚嚓嚓的声音再次想起,熟悉的感觉又回来了。我心说,算了,希望这个好些。上次那个估计没有保养好。

可是恼人的事情又来了,这次的键盘质量更差,才6个月不到回车键就失灵了。这样的质量,让我太失望了。

我曾经一度希望支持BENQ这样的国产品牌,我买BENQ的光驱,买BENQ的鼠标(公司里面),买BENQ的键盘,换来的结果就是没有一样东西能用超过1年的。一个还算知名的品牌,就连一个键盘,一个鼠标都做不好,还谈什么振兴国货!!

本来想直接去买罗技的键盘的,不过BENQ海湾键盘两年包换,我昨天带了键盘去换,没有发票,没有保修卡,人家也收下了,说检修完之后等到键盘来了就通知我。恩,售后还算不错,但我希望给我的不是返修货。。。。。。

我决定,这次拿到键盘就再用一阵子,如果再坏了,我不换了,直接去买罗技的。

2007年7月19日星期四

manila项目终于结束了

昨天,收到了马尼拉项目的项目经理发来的祝贺信,说客户终于签字接收了。由此,项目结束,开始进入一年的维护期。

这是我在Thales第一个完整的项目,历时一年半,经历了数不清的困难,现在收到一封简简单单的祝贺信,却让我由衷的高兴。

回想这一年多来的经历,也不是那么平淡的。自己眼界在开阔,经验在增加。

简单的写下自己一路走来的历程:

  • 一开始拿到手像狗屎一样的代码。
  • 开始在原来代码上改造,不过狗屎就是狗屎,永远不会变成美味的狗腿。
  • 到法国总部做第一次集成测试。天天品尝法国美食。
  • 第一次看到上位机程序和设备(下位机)通讯。
  • 第一次对整个AFC系统有了整体,清晰的理解
  • 步行游巴黎,里昂看老友。
  • 去签证署办延期,整整站了一天,深刻体会到法国公务员工作效率。
  • 在上海用模拟器痛苦的调试程序,体会和真实设备的天壤之别
  • 第一次去马尼拉部署,发现菲律宾是个贫富差距极其严重的国家。
  • 连续工作两个通宵49小时,没有空调,没有凳子,只有白花花跳动的Trace和那颗兴奋的心。
  • 看着自己的成果让几十万人用,激动的心情不言而喻。
  • 每天早上在5星级宾馆狂吃美味的早餐,省掉午餐,晚上和法国人在Makati一家一家餐馆吃过去
  • 回到家里发现自己重了整整5斤。
  • 第二次去马尼拉部署,开始学会坐轻轨,喝gulaman,尝试了解菲律宾普通人的生活。
  • 第三次去马尼拉,硬啃用法文写的代码,花了两个礼拜终于解决了困扰我们半年的通讯协议问题。
  • 在小年夜匆匆赶回上海。
  • 第四次去马尼拉,不停得到处救火,发现法国人的软件水平比较差,菲律宾人实在是懒。
  • 法国人卖给菲律宾人的烂键盘一年不到已经按下去键弹不起来了,鼠标被真正的老鼠咬坏。
  • 感叹没有知识,没有技术就要被别人欺负。
  • 第五次去马尼拉,被领事馆的签证官警告,如果再办旅游签证,将把我和我们公司放进黑名单。
  • PM换成了拽的没边法国小伙子。
  • 发现自己不过是个小巴拉子,法国的PM宁愿相信那个新来的PM也不愿意相信我这个全程跟进的工程师。法国公司和国企一样,等级森严啊。
  • 按照不合理的安排干了两个通宵。
  • 回来改掉最后几个Bug,发现法国人的设备全是毛病。
  • 然后---结束!
一个项目结束了,但别的项目在开始,在继续。生活也在继续。过了浪尖,又是平淡。