转载于:http://www.sm82.com/blog/article.asp?id=101
LeeFJ 翻译整理
Detail Of HelloWorldBasic Example
HelloWorld 这个简单的应用程序展示了在Symbian OS 60 上开发开发交互式应用程序的过程,虽然它很简单仅显示了“HelloWorld”这样一个字符串,但是要知道,HelloWorld 是我们开发的起点。
文 件 | 描 述 |
HelloWorldBasic.cpp | DLL 的入口点 |
HelloWorldApplication.h | Application 的作用是初始化程序其他部分,所以这里它将首先创建一个空的 Document 对象。 |
HelloWorldDocument.h HelloWorldDocument.cpp | Document 对象描述了用于构造 App UI 的数据。 |
HelloWorldAppUI.h HelloWorldAppUI.cpp | App UI(Application User Interface) 用于处理菜单所产生的各种命令。例如事件处理、系统调用等。 |
HelloWorldAppView.h HelloWorldAppView.cpp | 这个类主要目的是在屏幕上显示数据。 |
HelloWorldView.rss | 资源文件,用于描述菜单和字符串的来源。 |
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" 字样。 |
Figure-3: Program Start Run |
程序一旦运行 E32Dll 就被首先调用了,并传入 aReason 参数。这个参数可以是一下几个类型 EDllProcessAttach, EDllThreadAttach, EDllThreadDetach 或 EDllProcessDetach。.
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 核对并处理。
Figure-5:Getting the application's UID |
用于获取 UID 的 AppDllUid 函数必须出现,否则应用程序发生连接错误。
Figure-5:Creating the Document object |
关于程序程序更多细节请看代码,不做细述了 VC++6工程文件下载。