ECom step by step 1
第一步, 明白什么是ECom。 ECom不是个class,不是个function, ECom是个Framework。 Famework当然代表着一个Mechanism。Mechanism就是规则,是“爷”级人物制定的, 是“爹”级人物执行的,是“儿”级人物遵守的,也是给“孙子”们去破坏的。 所以无论想当哪一类人, 搞清楚“规则”是前提。 在ECom这个Mechanism中, 有这样几个角色, Application, ECom, Resolver, Plug-in。作为应用程序的源动力最我要干什么, 而不是ECom能干什么。 我要在我的Application中调用plug-in的方法,完成特定的功能。 ECom处在这个供需关系中, 则是为了帮我找到恰当的plug-in。 进而Resolver再帮我从Plug-in中找到我要的那个方法。显然ECom的一大好处就是替开发者作了很多事。 当然这不是设计ECom的全部目的。 ECom的Mechanism其实就是房屋中介的基本商业模式,ECom就是链家,我爱我家什么的。 Application当然要我写, 在里面调用构造Plug-in,就是向ECom发出请求。 Plug-in写必须提前写好,并到ECom里注册,否则ECom怎么找到你。 本来ECom提供了一个Resolver,如果你不满意,也可以自己写一个,从CResolver继承,然后注册到ECom里去, 将来构造Plug-in的实例时,可以把它作为参数传进去。 至于ECom如何找到Plug-in,如何Load,如何销毁,Symbian已经做好了。 所以需要程序员写的就是Application、plug-in、Resolver。 诺基亚说:“ECom是C/S架构,提供了实例化、解析、销毁插件的服务。”
ECom Step by Step 2
插件是遵循一定的接口规范编写出来的应用程序。所以编写插件必然要用利用C++的多态性,完成接口类和实现类。
另外,插件是如何被调用的。插件的主要作用是在不必修改实现应用程序的前提下,完成应功能扩展。调用机制必须提前在应用程序中做好。由于该机制成熟且频繁使用,多把这种机制从应用程序中提炼出上升到操作系统级。如IE中的ActiveX,需要到注册表中注册后才能被使用。
接下来我们将看到, ECom下的plug-in也有接口和实现,也要注册,保持了传统插件的特性。
Plug-in的工程文件的建立
Plug-in本质上是一个多态Dll,所以在工程文件中,TARGET是一个dll文件,而TARGETTYPE在3.0之后的程序里是PLUGIN,3.0以前的程序里是ECOMIIC。注意不是DLL,那样就会生成一个dll+lib,变成普通的Dll了。
创建Plug-in的步骤
ECom中的Plug-in的结构如图所示。
Plug-in由三部分组成,每部分都用一个UID标识。ECom就是通过注册的UID找到正确的对象的指针。
所以,实现一个Plug-in,总的来说有五步,完成Plug-in每个层次的构造和注册UID,导出UID表以便ECom能从代码里访问。
1.入口层
在S60 3.0以前的应用程序中,这个入口要显示的写出来,
TInt E32DLL()
{
return KErrNone;
}
标准的dll入口。3.0之后则不用。
2.接口层
定义一个接口类,类中定义一个构造函数NewL和一些提供功能的虚函数。另外还有一个成员变量TUid iDtor_ID_Key,该变量只在析构Plug-in时会用到。在应用程序中只调用这些方法。
NewL里调用方法REComSession::CreateImplementationL,用来通过RCom构造plug-in的实例,并把接口返回给应用程序。
REComSession::CreateImplementationL有带解析器和不带解析器两个版本。带解析器的版本需要把解析器的UID和解析关键字作为参数传进去。ECom通过解析器UID找到解析器,并且把Inferface UID和解析关键字作为参数传入解析器。
解析器会返回实现类的UID给ECom,ECom再根据这个UID构造plug-in的实例并把接口指针返回给应用程序。
3.实现层。
继承接口类并实现所有的纯虚方法。
4.注册。
Plug-in的层次结构要在资源文件中注册出来。 就好像会在ActiveX在注册表中注册一样。资源文件里标明了plug-in的每一部分的UID,此外还定义了plug-in的一些属性,包括用来解析的关键字等等。 注意2.0和3.0的dll uid不同。
不带解析器的版本, ECom会使用默认的解析器。
5.导出。
需要构造一张UID表并返回给框架。
至此,Plug-in构造完毕。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dymx101/archive/2010/03/18/5392116.aspx