天天看點

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”

最後,.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>

最大長度為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

\inc

*.h、*.loc、*.l**、*.pan、*.hrh等能被#include””包含的檔案

\install

*.pkg和随後生成的安裝檔案*.sis

\src

*.cpp類的C++源檔案