转载于:http://www.sm82.com/blog/article.asp?id=101
LeeFJ 翻译整理

Detail Of HelloWorldBasic Example

About this example

HelloWorld 这个简单的应用程序展示了在Symbian OS 60 上开发开发交互式应用程序的过程,虽然它很简单仅显示了“HelloWorld”这样一个字符串,但是要知道,HelloWorld 是我们开发的起点。

Design and implementation

文 件 描 述
HelloWorldBasic.cpp DLL 的入口点

HelloWorldApplication.h
HelloWorldApplication.cpp

Application 的作用是初始化程序其他部分,所以这里它将首先创建一个空的 Document 对象。
HelloWorldDocument.h
HelloWorldDocument.cpp
Document 对象描述了用于构造 App UI 的数据。
HelloWorldAppUI.h
HelloWorldAppUI.cpp
App UI(Application User Interface) 用于处理菜单所产生的各种命令。例如事件处理、系统调用等。
HelloWorldAppView.h
HelloWorldAppView.cpp
这个类主要目的是在屏幕上显示数据。
HelloWorldView.rss 资源文件,用于描述菜单和字符串的来源。

Static structure

HellWorld 例子的类图如下,这就是她的静态结构:

Figure-1: Hello World Basic class diagram

这个类图显示了这些类是如何实现 HelloWorld 的,以及哪些文件实现了这些类。另外,从图中还可以看到一个标准的应用程序所使用的类的继承结构。这里其实还可以进一步了解一下在类图中提到的每一个类的细节,了解他们的 API ,我想这对以后的开发是有帮助的。

这里需要插入一点,在Symbian的GUI程序开发中,有一些kon的东西,他们到底是什么意思,分别是做什么用的,我再这里多这些术语做一些解释。首先是图形框架的概念,图形框架由Eikon实现,在早期的Symbian OS v5 中,它仅支持8位的窄字符生成,到了v5.1,Unicode成了唯一支持的生成方式,为了体现支持Unicode,把名称改为Uikon了,但是实现图形框架的仍旧没有更改名称, Eikon(Uikon)的类包括:CEikApplication,CEikDocument,CEikAppUi,CEikEnv。在Symbain OS v6.1 的Series 60 UI 使用的附加层,这个附加层用于Uikon框架外观和行为的修改。在Symbain OS v7.0的UIQ程序中,Qikon取代了Avkon执行相似的工作。APPARC被称为应用程序框架,它包括CApaApplication和CApaDocument类。CONE是指控件环境,是Control Enviroment的缩写。

所有的类都是 CBase 类的派生类。CBase 类拥有一些比较有用的特性: 它会把所有的成员数据初始化为零;有一个虚构造函数;另外它还实现了 Symbian OS 垃圾清理栈。

Launch sequence and command handling

以下是 HelloWorld 运行的序列图。

在程序启动的时候,其真正启动的并非应用程序。而是一个名为apprun.exe的文件,apprun.exe调用了应用程序,但是必须给apprun.exe一些调用的参数信息:程序名字和应用程序文件名。然后,apprun.exe通过应用程序框架装载应用程序DLL。

Figure-2: Hello World Basic Sequence diagram

下面解释一下每一个消息的含义:

1 应用程序被运行,framework 载入应用 DLL ,并调用 E32Dll 方法。
1-2

framework 调用 NewApplication 方法,创建了一个 HelloWorldBasic 类的实例,并返回一个指向它指针,随后,framework将利用这个指针完成应用程序其他部分的构建工作。

4

framework 调用 AppDllUid 方法为这个应用程序获取UID。UID上唯一的他的作用是

5-8

framework 调用CHelloWorldBasicApplication 对象的 CreateDocumentL 方法。这样就创建了一个应用程序 Document 对象,并返回指向它的指针,这样 framework 就可以非常快捷地调用 Document 的方法对象了。Document 对象利用 NewL 方法,依照 Symbian OS 所规定的顺序构造其自身。

9

framework 调用 AppDllUid 查看是否有必要从文件系统加载文件。由于 HelloWorldBasic 这个例子中不需要保持任何数据,所以也就没有与之相关的数据文件了。

10-11

framework 调用 Document 对象的 CreateAppUiL 方法创建 App UI 对象,并返回指向该对象的指针。

12

framework 调用 ConstructL 方法构造 App UI 对象。framework 分开调用了 App UI 的构造函数和 ConstructL 方法,其目的在于,framework 可以在构造 App UI 对象前完成一些必要的初始化工作。

13

ConstructL 方法首先调用了基类的 BaseConstructL 。这个过程中,与应用相关的资源文件被读取。

14-16

App UI 对象 调用 NewL 方法创建 AppView 对象 ,这里 Symbian 使用了两个替代构造函数。

17

framework 调用 Draw 方法来绘制 View , 这个时候,设备会显示一个空的屏幕。

18-20

当用户选择选择了一个菜单选项的时候,HandlCommandL 被 framework 调用,并且传递一个名为 aCommand 的参数,这个参数指出了用户所选择的命令。App UI 要为这个菜单命令请求一个合适的动作。在这个例子里面,它选择了在屏幕显示 "HelloWorld" 字样。

The DLL entry point

Figure-3: Program Start Run

程序一旦运行 E32Dll 就被首先调用了,并传入 aReason 参数。这个参数可以是一下几个类型 EDllProcessAttach, EDllThreadAttach, EDllThreadDetachEDllProcessDetach。.

E32Dll 是一个全局函数,称为 DLL 入口点。这个函数在 Symbian OS 应用程序中是必须出现的,否则程序就会连接错误(Link Error)。

在这个范例中,函数返回了 KErrNone 来说明没有什么问题。在这个入口点中,可以用来初始化和重置应用程序所需要的一些本地存储线程。

最后需要注意的是,虽然在模拟器中,这个 DLL 入口点被调用,但是在目标设备上,默认情况下它将不被调用,如果需要在目标设备调用该 DLL 入口,那么需要在你的 .mmp文件中加入下面这一行:

EPOCCALLDLLENTRYPOINTS

Creating the Application object

Figure-4:Creating the Application object

在这里比较重要的一点需要注意的是:NewApplication 是被 DLL Export 的 (这个 Export 不知道要怎么表达,总之,Export 之后这个函数就可以被 DLL 外部访问了,可以理解为发布只类的吧)。它使用 EXPORT_C 声明,如果没有 EXPORT_C 声明,那么代码就会连接失败。

framework 首先调用那些被 DLL Export 的函数,也就是说,应用程序 DEF 文件中第一个定义的函数必须是 NewApplication 函数,这样那些开发工具就可以自动识别当前的应用程序是 Symbian OS 应用程序。

需要注意的是,这个构造函数没有使用通常 Sybiam OS 的 new (ELeave) methed_name 格式,而是使用了 C++ new 方法的格式,这是因为在这个时候 TRAP harness 还没有被创建,如果系统没有为应用程序获取内存,那么返回一个NULL指针,随后这件事情(内存未获取的事情)就被 framework 核对并处理。

Getting the application's UID

 

Figure-5:Getting the application's UID

用于获取 UID 的 AppDllUid 函数必须出现,否则应用程序发生连接错误。

Creating the Document object

Figure-5:Creating the Document object

关于程序程序更多细节请看代码,不做细述了 VC++6工程文件下载