Symbian OS高级开发篇之Ecom(1)

来源:互联网 发布:软件photocard 编辑:程序博客网 时间:2024/06/08 06:07

C++中,抽象类和虚函数意味着程序可以调用或访问类而不用知道其具体实现,这种机制允许实现在接口定义之后进行。这种实现称之为插件。Symbian OS中的ECOM就是一个通用的插件框架,提供了一个简单的机制,用以注册、查询接口实现,选择使用合适的实现,提供插件版本控制等。介绍ECOM如何完成这些工作前我们先来看一下插件系统的本质。

 

一个客户程序希望访问一个对象来进行一些处理,这个对象的具体实现直到运行之前是不知道的,我们只知道处理的一般特性和接口的定义,并且这些处理在相同的接口下有不同的变化。这样的系统有四种清晰定义的角色,即请求服务的客户程序、如何请求服务的接口定义、提供处理请求的接口实现以及提供客户程序访问具体实现(实例化)的框架。如下图所示:

Symbian OS Ecom plugin

 

1 插件关系图

 

实例化是这样的系统的核心,它负责提供识别出来的服务,运行时加载正确的接口实现。Ecom就是这样的一个框架,我们接下来分别从接口客户端、接口实现及接口定义这几方面来了解Ecom

 

接口客户端

插件框架的客户程序使用框架提供的C++接口来实现Ecom,除了以下的步骤并不需要额外的步骤:

  • 链接Ecom框架的库文件ecom.lib
  • Include接口定义文件
  • 通过接口的NewL方法获取一个对象,通常客户程序传递一些数据来表明所需对象的特性。
  • 使用对象
  • 对象使用结束后删除
  • 调用REComSession::FinalClose方法清除内存的使用

 

由于框架提供了大部分功能,所以接口客户端不需要做太多的工作,只需调接口即可,但内存的回收清除工作是一个例外。为了确保在不用时能正确卸载,并释放所用的内存,借口客户端应该遵循以下规则:

  • 当那些从接口获取的实例化对象不在使用时,应该删除。
  • 诸如服务、应用程序及测试程序等进程,必须在退出之前调用REComSession::FinalClose方法使得Ecom框架能够进行最终的清除工作。这个方法必须在所有实例化对象被删除之后才能调用。
  • 如果在库文件中使用了Ecom,应该在库文件的退出函数中调用REComSession::FinalClose方法。

 

需要注意的是FinalClose方法不能在接口或插件类的析构函数中调用。

 

接口定义

接口定义有两个目的,一是为客户端的使用定义函数,这些函数通常是纯虚函数,由实现者从它派生来提供具体的功能;另一目的是提供对象实例化功能,这个功能并不创建接口类自己的实例,而是使用Ecom创建合适的实现实例,返回给客户程序。接口在析构时会通知Ecom对象已被析构。

 

通常接口定义为Ecom提供了可用实现的识别,这种识别可以使显式的,如一个UID标示一个特殊的实现,也可以是间接的,如用数据来匹配实现的自我描述。这个选择的过程称为Resolution,执行的实体成为ResolverEcom提供了一个缺省的Resolver,但接口定义可以按需提供自己的Resolver

 

接口实现

一个接口实现提供接口约定的服务,实现以C++标准的方式来做,从基类派生。一个或多个接口实现集中在一个Dll中,称为一个接口实现集,一个集合可以拥有多个接口的实现,每个集合有两个关键的功能供Ecom使用:

  • 导出一个工厂函数的数组使得实现能被创建
  • 发布一个注册资源文件,列出所有的实现和属性

 

Ecom架构安全

Symbian OS的安全架构提供了恶意及非法代码的防护,保证了平台的安全性。以下是平台安全与Ecom插件架构相关的几个方面:

  • 平台安全的能力模型(capability model),它防止进程加载和使用比自身安全性还低的Dll
  • 控制软件安装,以确保其不能破坏已安装的软件。
  • 控制进程对特殊文件的访问。

Ecom中,插件是一个Dll,当提供接口实现的Dll被实例化时它被加载到客户端进程,如果插件Dll的能力(capability)比加载它的进程的能力低的话,系统会报请求被拒的错误(-46)。

 

插件的提供者必须考虑以下的安全性因素:

  • 如果提供一个无能力的插件,那这个插件只能被无能力的客户端进程加载使用。
  • 如果插件只为某个程序所用,那么那个程序的文档中应给出它需要什么样的能力。
  • 如果想让插件能被所有程序使用(除了内核和文件服务),那么应该将其设为完全能力的即Tcb, 当然这么高的能力是需要通过Symbian Sign的。
  • Resolver插件是一个特例,它被Ecom自身的一个服务进程加载,所以必须是被服务所信任的。这时插件要有ProtServ能力。

平台安全架构严格要求所有的可执行代码,包括插件,都放在/sys/bin/目录下,且对此目录的访问有限制,仅有少数的系统进程能够访问。另外插件所需的资源文件安装在/resource/plugins/目录下。

 

Ecom框架小结

Ecom框架代表接口定义提供在运行时解析(Resolve)和加载合适实现的能力,它是客户服务器结构,有一个单件模型的客户端会话类REcomSession,这个类具有创建、销毁和枚举实现的功能,服务端控制着实现的注册和加载。

 

前面提到过框架提供了缺省的Resolver,来选择合适的实现,接口可以通过询问框架来创建最合适的实现,或要求返回所有匹配的实现的列表,再通过其他方法来选择一个合适的实现。

[待续....]