本文和大家重点学习一下Symbian开发中Symbian资源的自定义和解析,Symbian开发有很多值得学习的地方,这里就和大家分享一下,相信通过本文的学习你对Symbian开发的概念一定会有明确的认识。
Symbian开发中Symbian资源的自定义和解析
在系统的CCoeEnv里面有个AllocReadResourceAsDes16LC这个函数可以把资源文件读取到数组里,做的上一个项目里面有很多字符串常量数组,我就想可不可以自己定义资源,然后读取呢,网上找个破资料还真不好找,今天有点空闲时间,测试了一下,可以实现自定义并读取,记录一下。
Symbian资源定义的数据类型
字段类型
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中
◆Symbian开发用这些类型定义自己的自定义资源。可以自己去系统的rh文件里面看看,操作系统定义的一些资源,分析分析
下面是我在rss里写的资源
STRUCTDATA
{
WORDwrd;
LONGlng;
LTEXTltxt;//variablelength
BYTEbyt;
DOUBLEdbl;
}
STRUCTDATAARRAY
{
STRUCTdataelement[];
}
STRUCTMYCUSTOM
{
WORDwrd;
LONGlng;
LLINKdatas;
}
//
//-----
RESOURCEDATAARRAYr_data_array
{
dataelement=
{
DATA
{
wrd=11;
lng=22;
ltxt="data1";
byt=1;
dbl=2.11;
},
DATA
{
wrd=33;
lng=44;
ltxt="data2";
byt=2;
dbl=3.11;
},
DATA
{
wrd=55;
lng=66;
ltxt="data3";
byt=3;
dbl=4.11;
}
};
}
RESOURCEMYCUSTOMr_mycustom_data
{
wrd=10;
lng=1000;
datas=r_data_array;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
在cpp里面读取以上自己写的资源
HBufC8*resource=CCoeEnv::Static()->AllocReadResourceAsDes8LC(R_MYCUSTOM_DATA);
TResourceReaderreader;
reader.SetBuffer(resource);
TInta=reader.ReadInt16();
TIntb=reader.ReadInt32();
TIntres=reader.ReadInt32();
HBufC8*res1=CCoeEnv::Static()->AllocReadResourceAsDes8LC(res);//转到LLINK的资源地址
reader.SetBuffer(res1);
TIntcount=reader.ReadInt16();//数组用前两个字节来标识数组长度
for(TInti=0;i<count;i++)
{
TIntwrd=reader.ReadInt16();
TIntlng=reader.ReadInt32();
TPtrCptr=reader.ReadTPtrC();
TIntbte=reader.ReadUint8();
TRealdbl=reader.ReadReal64();
}
CleanupStack::PopAndDestroy(2);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.