Symbian 資原始檔解析
一、何為資原始檔:
在symbian應用程式中,資原始檔指的是字尾名為.rss的檔案,每個應用程式至少要有一個與之關聯的資原始檔。資源編譯器rcomp編譯資原始檔後,生成一個.rsc二進位制檔案和一個相伴的標頭檔案(.rsg)。這樣在應用程式框架啟動應用程式時,會開啟這個二進位制檔案,藉助在.rsg檔案中建立的資源標誌符,根據需要把各個資源載入到C++程式碼中。
二、資原始檔的作用:
在資原始檔中指定使用者介面的佈局,如常用元件選單、對話方塊、列表等在介面上的排列樣式,另外還可以在其中指定介面上使用者可見的文字資訊。當然,這些可見文字並不一定通過字串在.rss資原始檔中定義,我們一般在.loc本地檔案中定義,而只需在.rss資原始檔中將.loc本地檔案引入(include)即可。(剛開始我百思不得其解,真不知道程式終相關的字串定義在哪裡的)
三、資原始檔的結構(語法):
資原始檔的具體結構由兩部分構成,分別稱為頭部和主體。
1、頭部:主要包括五部分,分別是檔名字、include包含語句、簽名、文件名緩衝、應用程式資訊資源這些些資原始檔標準資訊。
(1)名字:用NAME語句定義,該語句必須是資原始檔中第一個有意義的行(註釋和空白語句不在有意義行定義內),即這條語句要位於include包含語句之前,後面沒有分號。該語句指定一個由1到4個字元組成的名字,並建議使用大寫字元。如果應用程式使用了多個資原始檔的話,那麼可以通過它進行區分。如:NAME HELL
(2)include包含語句:允許使用其他地方定義的符號和結構。常見的有uikon.rh、eikon.rh、avkon.rh等
(3)簽名:它的內容實際上被忽略,但必須有這條語句,否則載入資源時便報錯。一般將實際內容置為空,如:RESOURCE RSS_SIGNATURE { } ,後面沒有分號。
(4)文件名緩衝:指定應用程式預設文件名的TBUF資源。大部分程式不使用文件,但仍然必須包含此資源,否則載入資源失敗。不需指定檔案的副檔名,因為S60本地文件不使用副檔名。如:RESOURCE TBUF { buffer=”HelloWorld”;}
在這裡的檔名將作為引數傳遞給CAknDocument類的OpenFileL(TBool aDoOpen, const TDesC& aFilename, RFs& aFs)方法。這允許一個應用程式在執行時開啟一個預設的文件。如果這裡的值為空那麼程式預設文件名和應用程式名一致。
(5)應用程式資訊資源:這個資源比較重要。EIK_APP_INFO資源為應用程式指定各種標準控制元件。如狀態皮膚等,通常會建立一個為狀態皮膚指定新內容的資源,然後使用EIK_APP_INFO資源的status_pane欄位引用它。如:
RESOURCE EIK_APP_INFO
{
hotkeys = r_HelloWorld_hotkeys;
menubar = r_HelloWorld_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
注意:頭部中定義的各種資源都沒有資源名。
2、主體
主體部分主要定義了應用程式中將要使用的各種資源。
它的一般定義格式如下:
RESOURCE STRUCTNAME resource-name
{
resource-initializer-list
}
在這裡STRUCTNAME應替換為具體的資源結構型別,而這些資源結構型別已在檔案頭部include包含的eikon.rh、uikon.rh、avkon.rh中進行了定義。
資源名resource-name必須小寫,通常以r_開頭,而在C++檔案中使用他們時必須大寫,這和資源編譯器工作方式有關。例如:
//資源名定義
RESOURCE AVKON_VIEW r_viewmychannelhot
{
hotkeys=r_xv_hotkeys;
menubar=r_menubar_viewmychannelhot;
cba=R_AVKON_SOFTKEYS_SELECTION_LIST;
}
//資源呼叫
BaseConstructL(R_VIEWMYCHANNELHOT);
下面具體研究resource-initializer-list(初始化資源欄位),根據要資源欄位的不同型別,初始化欄位有三種不同方式:簡單初始化器、陣列初始化器、結構初始化器。如下:
RESOURCE STRUCT r_my_example_struct
{
simple=EeikCtLabel; //簡單初始化器,分配單個值或字串
array={1,2,3}; //陣列初始化器,大括號,元素用逗號隔開
structmember=OTHERSTRUCT //結構初始化器,編譯器不進行型別檢查,要小心
{
simple1=”hello”;
simple2=”goodbye”;
}
}
由以上示例可知:
簡單初始化器:為欄位分配單個值或字串;
陣列初始化器:為陣列欄位分配單個或多個值,格式用大括號括起,其中元素用逗號隔開;
結構初始化器:為結構欄位分配單個或多個值。首先初始化時需要提供結構名,而後指定結構每個欄位;其次資源編譯器不進行型別檢查,所哦一設定值時必須與結構欄位相應型別一致,否則編譯能通過但是執行會出錯。
由於採用不同的控制元件時,其採用的資源欄位各不相同,所以先分析三類具體的資源定義,具體控制元件的資源定義,放在具體控制元件中闡述。
(1)字串資源:
可以使用TBUF資源將字串包含在資原始檔中。通常,會在一個.loc檔案中或是在指定語言的.lxx檔案中定義字串文字,而不是在.rss檔案中定義它們,只需在.rss檔案中將.loc檔案包含進來即可。
.lxx檔案中的xx應該替換為e32std.h中的Tlanguage列舉定義的兩位數字區域設定碼,之後按照.mmp專案檔案中設定的當前生成區域設定把.lxx檔案包含到.loc檔案中。看一個定義了.lxx檔案的.loc檔案例項:
#ifdef LANGUAGE_01
#i nclude “MyApp.101”
#endif
#ifdef LANGUAGE_02
#i nclude “MyApp.l02”
#endif
最後,.101和.102檔案以各自的語言定義字串,比如:
#define STR_HELL0 “Hello World”
為了確保編譯資源時將使用正確的字串,應該在.mmp檔案中包含一行或多行LANG語句,導致生成兩個二進位制資原始檔:.r01和.r02。
LANG 01
LANG 02
(2)標點:介紹如何使用標點符號
a、所有賦值語句之後都應該有分號
b、列表中的元素以逗號分隔
c、資源定義後以及列表中最後一個元素之後不應有分號
舉例:
RESOURCE AVKON_VIEW r_myapp_view
{
menubar=r_myapp_menubar;//賦值語句後有分號
cba=r_myapp_cba;//賦值,需要分號
} //資源定義結尾,無需分號
…
RESOURCE TAB_GROUP r_myapp_tabgroup
{
tab_width=EaknTabWidthWithTwoTabs;
active = 0;
tabs =
{
TAB //列表中的第一個TAB STRUCT
{
id = EnavigationPaneTab1;
txt = TAB1_TEXT;
}, //列表元素之間用逗號分隔
TAB
{
id = EnavigationPaneTab2;
txt = TAB2_TEXT;
} //列表結尾無需分號
}; //將列表賦值給tabs,需要分號。
}
(3)建立資源結構:
RESOURCE語句用於建立特定資源的例項,而STRUCT語句則用於定義資源型別,建立的所有STRUCT定義都應該儲存在一個副檔名為.rh的檔案中。(從這裡顯然我們可以試著去開啟eikon.rh、uikon.rh、avkon.rh檔案看看,裡面是否都是STRUCT打頭的資源型別定義)
常用STRUCT欄位型別見資原始檔STRUCT欄位型別表。,除簡單欄位外,還可以把欄位定義為一個由相同型別的值組成的陣列,在欄位名後新增一對方括號即可。如:
STRUCT MENU_PANE
{
STRUCT items[ ];
LLINK extension=0;
}
常用資源欄位型別
欄位型別 |
說明 |
BYTE |
單位元組,解釋為一個有符號或無符號整數 |
WORD |
雙位元組,解釋為一個有符號或無符號整數 |
LONG |
四位元組,解釋為一個有符號或無符號整數 |
DOUBLE |
八位元組,表示一個雙精度浮點數 |
TEXT |
以NULL結尾的字串,已廢棄,建議使用LTEXT |
LTEXT |
Unicode字串,帶有一個前導位元組儲存長度,沒有終止NULL |
BUF |
Unicode字串,沒有前導位元組,沒有終止NULL |
BUF8 |
8位字元組成的字串,沒前導和終止,用於放入8位資料 |
BUF |
最大長度為n的Unicode字串,沒有前導和終止 |
LINK |
另一個資源的16位ID,類似於擁有指定資源的一個引用 |
LLINK |
另一個資源的32位ID |
SRLINK |
自引用LINK,該型別欄位值由資源編譯器自動分配,不能自行提供初始化值,是一個32位ID |
STRUCT |
結構,建立本身就是STRUCT的欄位,使用它可以把STRUCT嵌入到STRUCT中 |
STRUCT的型別名字必須都大寫,不能含有空格,且以字母字元開始;在具體每個欄位的定義時,依次由欄位型別、欄位名、可選初始值和一個分號組成。型別必須全部大寫,欄位名必須小寫,如果提供預設值,則在資源定義中使用此型別資源結構是可以省略該欄位,此時將使用預設值。
三、與資原始檔有關的系統標頭檔案及其他檔案:
如上提到的與資原始檔相關的*.rh、*.loc和*.*.rsg之外,在資原始檔中,往往還會引入其它諸如*.hrh和*.mbg檔案,由於這是本人第一篇關於Symbian的小結,所以在這裡藉資原始檔的解析順帶將其它檔案也小結一下:
*.h和*.cpp是最基礎的C++標頭檔案和C++原始檔(這個不用做介紹都知道);
*.rss是Symbian的資源原始檔,主要定義資源例項,具體定義了應用程式UI所需所有字串、按鍵、選單和列表等等控制元件資源,在Series 60以後,將字串的具體定義放在了*.loc檔案中,更有益於UI本地化和國際化,另據文件說明,*.rss可以擴充套件為*.r??用於多國語言版本;
*.rh是Symbian的資源標頭檔案,負責資源結構型別的定義,除了預處理語句外就是STRUCT語句,它只能被資源原始檔包含;
*.hrh是可以被C++檔案(包括標頭檔案和原始檔)和Symbian資原始檔(包括*.rss和*.rh)包含的標頭檔案,其內基本是預處理語句和enum列舉語句,這些列舉語句往往是選單、工具條等的命令索引值,在switch…case語句中使用;
*.rsc檔案是*.rss檔案編譯生成的資源(二進位制)檔案,在資源原始檔編譯過程中還會產生*.rsg檔案,該檔案內是*.rss資源原始檔中資源的ID值,C++原始檔包含它後可以通過資源ID直接裝載資源。
與資源相關的還有*.mbg檔案,它和*.rsg一樣是編譯生成的ID檔案,具體實現通常在*.mmp(後面介紹)檔案中將各種Window bmp點陣圖包含進來,通過編譯生成*.mbm的過程中產生(該過程可能呼叫了aifbuilder這一圖示設計工具)。而*.mbm是Symbian系統的影像檔案。在這裡只要對照rsc檔案的過程就行,只不過mbm是UI的圖形和影像資源。(這裡至於換膚和aifbuilder的一些東西,我還不是很清楚,為此沒做展開)
*.inl檔案是行內函數的原始檔,通常行內函數在C++標頭檔案中實現,但有時為了考慮將其實現與標頭檔案分離,故意在另一檔案中實現,通常它在宣告行內函數的標頭檔案的末尾被#include語句包含進來。
*.pan檔案是為應用程式建立一份應急程式碼,字面意思應急程式碼在開發過程中顯示程式的錯誤用的,但是具體我也沒有用到過,所以也不知道如何解釋更好些。
*.aif的檔案,查到說是Symbian系統的應用程式資訊檔案,Aif檔案的主要作用是在目標裝置的選單中顯示圖示,由專門的aiftool應用程式產生,也跟本地化有關。
構建檔案*.mmp是為控制檯應用程式abld準備的專案定義檔案,其功能類似makefile,但是它可能比makefile還複雜,因為Symbian構建工具在mmp檔案基礎上才能產生makefile檔案,具體專案定義檔案的格式後面再另作解析。
構建檔案bld.inf是構建時的資訊檔案,通常其內只有一個*.mmp用於指向要編譯的專案定義檔案,但是也可以包含多個*.mmp,具體多個時我試過,只要路徑設定正確就可以實現。
根據不同的構建目的,執行abld命令將產生各種不同的目標檔案,具體由:*.app(Symbian的系統執行檔案相當於Windows的exe檔案,它是多型的DLL)、*.dll(共享的dll檔案)、*.exe(Symbian系統服務或可執行檔案,我將其理解為控制檯程式,不知道是否正確,該檔案在Window上裝有模擬器情況下可以自動執行模擬器)。
打包檔案*.pkg檔案,該檔案是為控制檯應用程式makesis準備用來生成*.sis手機安裝檔案的的定義檔案,其語法比較簡單,在這裡不做展開。
既然對檔案已經做了如上分析,那麼順其自然對常見的檔案目錄也用下表列出做下簡單描述
資料夾 |
內容描述 |
\aif |
存放*.aif和*.aif的源點陣圖(*.bmp) |
\data |
用於產生*.src的*.rss資源原始檔 |
\group |
與平臺無關的專案檔案如*.mmp、*.inf有時也放*.rss |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12231076/viewspace-334/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
谷歌將為iphone手機開發整合新介面
下一篇:
解決遊戲中不能用紅外
請登入後發表評論
登入
全部評論
|
相關文章
- Symbian中操作ini檔案
- Symbian中ini檔案的使用
- Maven讓資原始檔處理外掛能夠解析資原始檔中的Maven屬性Maven
- Lucene原始碼解析--Lock檔案原始碼
- 原始碼解析Flask的配置檔案原始碼Flask
- QT資原始檔QT
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- Symbian OS上的檔案操作和UNICODE轉換Unicode
- Android資原始檔Android
- .Net Core中的配置檔案原始碼解析原始碼
- Lucene原始碼解析--刪除文件檔案(.del)原始碼
- Symbian作業系統作業系統
- vue原始碼解析之資料代理Vue原始碼
- SOFARegistry 原始碼|資料同步模組解析原始碼
- ZooKeeper原始碼解析(5)-Snapshot檔案的格式原始碼
- Lucene原始碼解析--Compound File 組合檔案原始碼
- mybatis原始碼配置檔案解析之五:解析mappers標籤流程圖MyBatis原始碼APP流程圖
- 反編譯APK資原始檔與原始碼編譯APK原始碼
- SpringBoot原始碼解析-配置檔案的載入Spring Boot原始碼
- thinkphp-資原始檔載入PHP
- 資原始檔的應用 (轉)
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- myBatis原始碼解析-資料來源篇(3)MyBatis原始碼
- HashMap底層資料結構原始碼解析HashMap資料結構原始碼
- Android 資料庫 ObjectBox 原始碼解析Android資料庫Object原始碼
- 使用webpack打包ThinkPHP的資原始檔WebPHP
- iOS - 拷貝resource資原始檔夾iOS
- C#使用資原始檔的方法C#
- java讀資原始檔的問題Java
- DEX檔案解析--7、類及其類資料解析(完結篇)
- CountDownLatch原始碼解析CountDownLatch原始碼
- LeakCanary原始碼解析原始碼
- vuex原始碼解析Vue原始碼
- ArrayBlockQueue原始碼解析BloC原始碼
- AsyncTask原始碼解析原始碼
- CopyOnWriteArrayList原始碼解析原始碼
- Express原始碼解析Express原始碼
- Observer原始碼解析Server原始碼