详解HelloWorldBasic实例
轉(zhuǎn)載于:http://www.sm82.com/blog/article.asp?id=101
LeeFJ 翻譯整理
Detail Of HelloWorldBasic Example
About this example
HelloWorld 這個簡單的應用程序展示了在Symbian OS 60 上開發(fā)開發(fā)交互式應用程序的過程,雖然它很簡單僅顯示了“HelloWorld”這樣一個字符串,但是要知道,HelloWorld 是我們開發(fā)的起點。
Design and implementation
| 文 件 | 描 述 |
| HelloWorldBasic.cpp | DLL 的入口點 |
| HelloWorldApplication.h | Application 的作用是初始化程序其他部分,所以這里它將首先創(chuàng)建一個空的 Document 對象。 |
| HelloWorldDocument.h HelloWorldDocument.cpp | Document 對象描述了用于構(gòu)造 App UI 的數(shù)據(jù)。 |
| HelloWorldAppUI.h HelloWorldAppUI.cpp | App UI(Application User Interface) 用于處理菜單所產(chǎn)生的各種命令。例如事件處理、系統(tǒng)調(diào)用等。 |
| HelloWorldAppView.h HelloWorldAppView.cpp | 這個類主要目的是在屏幕上顯示數(shù)據(jù)。 |
| HelloWorldView.rss | 資源文件,用于描述菜單和字符串的來源。 |
Static structure
HellWorld 例子的類圖如下,這就是她的靜態(tài)結(jié)構(gòu):
| Figure-1: Hello World Basic class diagram |
這個類圖顯示了這些類是如何實現(xiàn) HelloWorld 的,以及哪些文件實現(xiàn)了這些類。另外,從圖中還可以看到一個標準的應用程序所使用的類的繼承結(jié)構(gòu)。這里其實還可以進一步了解一下在類圖中提到的每一個類的細節(jié),了解他們的 API ,我想這對以后的開發(fā)是有幫助的。
| 這里需要插入一點,在Symbian的GUI程序開發(fā)中,有一些kon的東西,他們到底是什么意思,分別是做什么用的,我再這里多這些術(shù)語做一些解釋。首先是圖形框架的概念,圖形框架由Eikon實現(xiàn),在早期的Symbian OS v5 中,它僅支持8位的窄字符生成,到了v5.1,Unicode成了唯一支持的生成方式,為了體現(xiàn)支持Unicode,把名稱改為Uikon了,但是實現(xiàn)圖形框架的仍舊沒有更改名稱, Eikon(Uikon)的類包括:CEikApplication,CEikDocument,CEikAppUi,CEikEnv。在Symbain OS v6.1 的Series 60 UI 使用的附加層,這個附加層用于Uikon框架外觀和行為的修改。在Symbain OS v7.0的UIQ程序中,Qikon取代了Avkon執(zhí)行相似的工作。APPARC被稱為應用程序框架,它包括CApaApplication和CApaDocument類。CONE是指控件環(huán)境,是Control Enviroment的縮寫。 |
所有的類都是 CBase 類的派生類。CBase 類擁有一些比較有用的特性: 它會把所有的成員數(shù)據(jù)初始化為零;有一個虛構(gòu)造函數(shù);另外它還實現(xiàn)了 Symbian OS 垃圾清理棧。
Launch sequence and command handling
以下是 HelloWorld 運行的序列圖。
| 在程序啟動的時候,其真正啟動的并非應用程序。而是一個名為apprun.exe的文件,apprun.exe調(diào)用了應用程序,但是必須給apprun.exe一些調(diào)用的參數(shù)信息:程序名字和應用程序文件名。然后,apprun.exe通過應用程序框架裝載應用程序DLL。 |
| Figure-2: Hello World Basic Sequence diagram |
下面解釋一下每一個消息的含義:
| 1 | 應用程序被運行,framework 載入應用 DLL ,并調(diào)用 E32Dll 方法。 |
| 1-2 | framework 調(diào)用 NewApplication 方法,創(chuàng)建了一個 HelloWorldBasic 類的實例,并返回一個指向它指針,隨后,framework將利用這個指針完成應用程序其他部分的構(gòu)建工作。 |
| 4 | framework 調(diào)用 AppDllUid 方法為這個應用程序獲取UID。UID上唯一的他的作用是 |
| 5-8 | framework 調(diào)用CHelloWorldBasicApplication 對象的 CreateDocumentL 方法。這樣就創(chuàng)建了一個應用程序 Document 對象,并返回指向它的指針,這樣 framework 就可以非常快捷地調(diào)用 Document 的方法對象了。Document 對象利用 NewL 方法,依照 Symbian OS 所規(guī)定的順序構(gòu)造其自身。 |
| 9 | framework 調(diào)用 AppDllUid 查看是否有必要從文件系統(tǒng)加載文件。由于 HelloWorldBasic 這個例子中不需要保持任何數(shù)據(jù),所以也就沒有與之相關(guān)的數(shù)據(jù)文件了。 |
| 10-11 | framework 調(diào)用 Document 對象的 CreateAppUiL 方法創(chuàng)建 App UI 對象,并返回指向該對象的指針。 |
| 12 | framework 調(diào)用 ConstructL 方法構(gòu)造 App UI 對象。framework 分開調(diào)用了 App UI 的構(gòu)造函數(shù)和 ConstructL 方法,其目的在于,framework 可以在構(gòu)造 App UI 對象前完成一些必要的初始化工作。 |
| 13 | ConstructL 方法首先調(diào)用了基類的 BaseConstructL 。這個過程中,與應用相關(guān)的資源文件被讀取。 |
| 14-16 | App UI 對象 調(diào)用 NewL 方法創(chuàng)建 AppView 對象 ,這里 Symbian 使用了兩個替代構(gòu)造函數(shù)。 |
| 17 | framework 調(diào)用 Draw 方法來繪制 View , 這個時候,設(shè)備會顯示一個空的屏幕。 |
| 18-20 | 當用戶選擇選擇了一個菜單選項的時候,HandlCommandL 被 framework 調(diào)用,并且傳遞一個名為 aCommand 的參數(shù),這個參數(shù)指出了用戶所選擇的命令。App UI 要為這個菜單命令請求一個合適的動作。在這個例子里面,它選擇了在屏幕顯示 "HelloWorld" 字樣。 |
The DLL entry point
| Figure-3: Program Start Run |
程序一旦運行 E32Dll 就被首先調(diào)用了,并傳入 aReason 參數(shù)。這個參數(shù)可以是一下幾個類型 EDllProcessAttach, EDllThreadAttach, EDllThreadDetach 或 EDllProcessDetach。.
E32Dll 是一個全局函數(shù),稱為 DLL 入口點。這個函數(shù)在 Symbian OS 應用程序中是必須出現(xiàn)的,否則程序就會連接錯誤(Link Error)。
在這個范例中,函數(shù)返回了 KErrNone 來說明沒有什么問題。在這個入口點中,可以用來初始化和重置應用程序所需要的一些本地存儲線程。
最后需要注意的是,雖然在模擬器中,這個 DLL 入口點被調(diào)用,但是在目標設(shè)備上,默認情況下它將不被調(diào)用,如果需要在目標設(shè)備調(diào)用該 DLL 入口,那么需要在你的 .mmp文件中加入下面這一行:
| EPOCCALLDLLENTRYPOINTS |
Creating the Application object
| Figure-4:Creating the Application object |
在這里比較重要的一點需要注意的是:NewApplication 是被 DLL Export 的 (這個 Export 不知道要怎么表達,總之,Export 之后這個函數(shù)就可以被 DLL 外部訪問了,可以理解為發(fā)布只類的吧)。它使用 EXPORT_C 聲明,如果沒有 EXPORT_C 聲明,那么代碼就會連接失敗。
framework 首先調(diào)用那些被 DLL Export 的函數(shù),也就是說,應用程序 DEF 文件中第一個定義的函數(shù)必須是 NewApplication 函數(shù),這樣那些開發(fā)工具就可以自動識別當前的應用程序是 Symbian OS 應用程序。
需要注意的是,這個構(gòu)造函數(shù)沒有使用通常 Sybiam OS 的 new (ELeave) methed_name 格式,而是使用了 C++ new 方法的格式,這是因為在這個時候 TRAP harness 還沒有被創(chuàng)建,如果系統(tǒng)沒有為應用程序獲取內(nèi)存,那么返回一個NULL指針,隨后這件事情(內(nèi)存未獲取的事情)就被 framework 核對并處理。
Getting the application's UID
?
| Figure-5:Getting the application's UID |
用于獲取 UID 的 AppDllUid 函數(shù)必須出現(xiàn),否則應用程序發(fā)生連接錯誤。
Creating the Document object
| Figure-5:Creating the Document object |
關(guān)于程序程序更多細節(jié)請看代碼,不做細述了 VC++6工程文件下載。
轉(zhuǎn)載于:https://www.cnblogs.com/jackyChen/archive/2006/06/05/417923.html
總結(jié)
以上是生活随笔為你收集整理的详解HelloWorldBasic实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以“百钱买百鸡”问题练习使用 C语言 g
- 下一篇: Android年月日选择,Android