一、何为资源文件:<?XML:NAMESPACE PREFIX = O />
在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<?XML:NAMESPACE PREFIX = ST1 />.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>
最大长度为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++源文件

转载于:https://blog.51cto.com/juwen/115832

Symbian 资源文件解析相关推荐

  1. JavaWeb1——互联网通信流程、共享资源文件、开发人员角色

    1.第3阶段学习 1.1.学习任务 掌握互联网通信流程 1.2.学习特点 1.2.1.背,互联网通信流程中的每一个细节 1.2.2.本阶段使用的命令都是老旧命令,无需记忆. 1.3.学习要求 1.3. ...

  2. springboot配置国际化资源文件 使用themself模板进行解析

    2019独角兽企业重金招聘Python工程师标准>>> @ConfigurationProperties(prefix = "spring.messages") ...

  3. PHP下载m3u8视频及解析下载ts资源文件

    上一篇写了PHP生成合并ts脚本,后来又想直接下载m3u8里面的ts,又码了一段. <?php /** PHP下载m3u8视频和及解析下载ts资源文件** @file m3u8download. ...

  4. Java笔记-读取资源文件应该注意的问题(大文件解析、\r\n分割相关的)

    目前在弄一个模拟程序,数据是从XXXXXXX里XXXXX获取的,也算是真实的把,将其放到资源文件中. 如下代码在IDEA开发环境里面是正常的: byte[] bytesxxx = new byte[i ...

  5. ServletContext的应用(共享数据、获取初始化参数、请求转发、读取资源文件)【源码解析】

    ServletContext应用 1.共享数据 我在这个Servlet中保存的数据,可以在另外一个Servlet中拿到 public class HelloServlet extends HttpSe ...

  6. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...

  7. **IOS:xib文件解析(xib和storyboard的比较,一个轻量级一个重量级)

    使用Xcode做iOS项目,经常会和Xib文件打交道,因为Xib文件直观的展现出运行时视图的外观,所以上手非常容易,使用也很方便,但对于从未用纯代码写过视图的童鞋,多数对Xib的理解有些片面. Xib ...

  8. Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组

    一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...

  9. iOS - Bundle 资源文件包

    原文:https://www.cnblogs.com/QianChia/p/6280435.html 1.Bundle 文件 Bundle 文件,简单理解,就是资源文件包.我们将许多图片.XIB.文本 ...

最新文章

  1. r语言 图形一览_R语言之图形概览
  2. 使用opencv自带的融合函数
  3. zTree 异步加载 添加子节点重复问题 .
  4. python安装常见问题_Python常见问题
  5. 微服务get请求条用_SpringCloud微服务(07):Zipkin组件,实现请求链路追踪
  6. 2021年,彩票店还开的下去吗?
  7. 电脑关机很慢是怎么回事
  8. r语言 html 变为ppt,如何用R来定制个性化PPT
  9. 低价战略 革命主机价格将低于299美金
  10. Eclipse官网快速下载
  11. 《计算机工程》投稿经验
  12. Pytorch:定义的网络结构层能否重复使用
  13. etax导入账户不让勾选_勾选认证详解及常见问题分析
  14. 易基因技术推介|简化基因组甲基化测序研究解决方案
  15. 比较器的简单介绍及应用
  16. 杨辉三角循环队列实现(数据结构c语言版)
  17. python编程工具-7款Python开发工具介绍,你最中意哪一款
  18. 打成jar包 在命令行下执行java工程
  19. 毕业设计时如何搜集相关资料等问题解答
  20. 20. 有效的括号-C语言

热门文章

  1. Android中获取当前位置的使用步骤
  2. CNN-1: LeNet-5 卷积神经网络模型
  3. Linux中crontab无法执行java程序的问题
  4. Combination Sum 和Combination Sum II
  5. 在ASP.NET页面中动态添加控件
  6. 微信小程序canvas动态时钟
  7. ElementUI改变el-table的表头颜色以及各行的颜色
  8. mysql中的类型与java_mysql与java数据类型对应关系
  9. python 内置函数转list_python 内置函数等的相互转换示例
  10. php 生成wsdl工具,php中使用zendstudio 12为soapserver生成wsdl文件