[转贴]Symbian开发入门 - UIQ开发教程


文章作者:无双:
原发处:loveunix.net
欢迎转载,但是保留原作者与发表网站
保留版权声明

文章作者:无双:
原发处:loveunix.net
欢迎转载,但是保留原作者与发表网站
保留版权声明

  symbian是智能手机中的操作系统
  在目前手机操作系统的争夺中,Symbian市场占有率达到了70%,是当之无愧的老大,而微软的
  windowsmobile和其他操作系统一共只有30%的份额。
  
  而当前 最有潜力的市场就是智能手机市场 无论是开发还是其它方面
  
  所以 与其学会vc 让别人挑三捡四 一个月7800的工资打发 跟民工差不多 还不如学习symbian
  一个月拿个78k 最不济也可以自己开发symbian上的共享软件谋生
  
  
  目前,全球主流手机操作系统争夺主要有三种:
   1.Symbian操作系统:按持股比例多少,由诺基亚、爱立信、索尼爱立信、松下、三星、西门子共6家厂商顺序组成的Symbian联盟把持。优点是价格适中,对手机要求较低,缺点是开发人员少。
   2.windows mobile操作系统:优点在于可以方便地和PC上的windows进行互通,开发人员多,但缺点是授权费最高,对手机要求也高。
   3.Linux:全球开放的系统,任何厂家和开发商均可使用,优点是价格最低,对手机要求最低,缺点也很明显,厂家各自为营,手机之间的互通性差
  
  
  
  symbian公司的历史与构成
  symbian是由手机界诺基亚、爱立信、moto、松下、三星、西门子五大巨头与pison联合起来 为了反对微软的进攻而成立的一个公司 开发自己的智能手机操作系统
  后面由于其它变化 moto减少持股 同时pison离开 索爱加入 但是仍是这几家大公司持股
  
  当symbian成立后 ms也推出了smartphone操作系统 准备进攻移动手机市场 但现在以失败告终
  而symbian随着手机的发展得到了越来越多的市场
  
UIQ:UIQ是在symbian之上工作的一层包装 它对界面进行了包装 同时增加了一些常用的应用程序
现在索爱的p800,p910就是使用uiq
下面是uiq与symbian的关系

但是具体来说 界面包装并没有改变太多 只是为了方便重定义了自己的图形类代替symbian中相同功能的类
相当于普通操作系统上的theme(主题)一样 你可以选择使用这个theme 并在它之上开发
theme只是进行了简单包装并改变了显示方式
 安装
  
  这里介绍的是UIQ 也就是索爱P800系列的开发
  
  所以可以先从网上下载UIQ的安装文件 及安装vc6
  .net不合适
  
  当然如果有钱 那可以买codewarrior 这是支持最好的
  
  具体的安装 下载后直接点安装就可以了
  
  安装在c:盘c:/symbian
  
  安装到其它盘可能会有问题

symbian有两类分支 一类是nokia的s系列 如s60,s80,s90,另一类是索爱的uiq
这两个只是界面库的不同
它们在symbian的基础上加上自己的界面库 这个库只是附加的 你当然可以使用symbian的api来画界面 但是使用uiq或是s系列的接口 然后运行在对应的手机上
视觉效果会更好 (索爱的手机视图与诺基亚的界面效果是有很大不同的)
具体的不同后面会再补充
 随着.com 与java后 移动开发将会是下一轮开发中的主流技术
  当前pc的软件已经足够多 要完成相同功能的软件 你最少可以找到十个不同的厂家的实现
  但是在移动领域 你想实现某个功能 基本上找不到相关的好用的软件 所以在这里开发 你的市场机会会更大 并且竞争对手会更少
  
  所以 移动开发将会是更有前途的行业
  而symbian 以自己70%的市场占有量 更应该是这个开发的首选
  
  symbian开发介绍:
  symbian操作系统与普通pc的不同是:
  symbian上内存不够多 ,并且cpu速度慢,所以开发的话需要考虑到节省内存的原则 另外就是分配内存失败时的处理 在这点pc基本上不用考虑 因为有真实内存加上虚拟内存 够用的
  symbian操作系统可能运行好几个月 但是你的程序随时可能因为异常而退出 退出时释放程序使用的内存及其它相关资源就相当重要
  
界面开发最简单的方法是使用c++ 把相关的图形操作使用类来封装,所以symbian的sdk以c++ 类库形式提供 如果你还是使用c 那还是赶紧学习c++

由于symbian运行的环境有限,所以为了提高性能减少资源使用 symbian对标准c++进行了一定的修改,其中最明显的是去掉了异常处理机制

另一个就是对模板进行了简化 当然模板方面在语言开发中不会有不同 只是修改了它的实现 这个可以不用管 只是像c++中的模板一样使用好了

symbian在语言级不支持异常,但是以库与宏的形式来提供对导常的支持
throw 对应于 User::Leave或是leave相关函数
try{}catch(...){}对于于TRAP和TRAPD宏 TRAPD宏与TRAP只是增加了变量定义过程 这两个没有区别

另外 由于资源有限,所以有些程序可能因为不正常的使用资源而死掉 或是因为资源使用完而无法正常执行
这时 虽然可以自己增加错误处理过程 但是这样的过程太多了 如内存分配 每次分配完 都要检查是不是成功 没有成功就释放资源程序退出 这样代码量就很大 而在实时系统中 需要的是代码少而精
所以 symbian提供了cleanupstack(清除堆栈)机制
当你申请了资源后 把它Push到cleanupstack中 那后面如果某个申请失败了 可以直接调用User::Leave退出程序 操作系统会自动帮你释放你申请的资源 这样代码量就减少
如果已经成功的使用完资源了 需要自己释放 那就调用PopAndDestroy手动释放它
  
为了保证程序退出时用户申请的资源全部释放(主要是内存) 所以symbian同时提供了heap marking机制,程序开始时标记当前堆信息 退出时检查并释放没有释放的堆
  
  总之就是symbian开发中需要自己处理下面的事情:
   trap harness,cleanup stack,leave,heap marking


其实跟c++比起来 symbian对释放资源的操作通过cleanupstack进行了支持
只是需要自己手动的把资源放到cleanupstack中
这样可以认为是c++的手动管理资源与java的自动资源管理的一个折中
第一个控制台下的hello world程序
很多语言都是从hello world 开始 学习symbian也不例外 下面从一个简单的hello world程序开始 介绍symbian的特点
CODE
//hellotext.cpp
#include
#include
LOCAL_D CConsoleBase* gConsole;
//  Real main function
void MainL()
{
 TBuf    helloWorld(_L("hello"));
 helloWorld.Append(_L("World"));
 gConsole->Printf(helloWorld);
// 可以把上面三句改成gConsole->Printf(_L"hello world");
}
//  Console harness
void ConsoleMainL()
{
 gConsole    = Console::NewL(_L("Hello Text"),
         TSize(KConsFullScreen,KConsFullScreen));
 CleanupStack::PushL(gConsole);
 MainL();
 User::After(5000000);
 CleanupStack::PopAndDestroy(gConsole);
}
GLDEF_C TInt    E32Main()
{
 __UHEAP_MARK;
 CTrapCleanup* cleanupStack  = CTrapCleanup::New();
 TRAPD(error,ConsoleMainL());
 __ASSERT_ALWAYS(!error,User::Panic(_L("SCMP"),error));
 delete cleanupStack;
 __UHEAP_MARKEND;
 return 0;
}



编译与运行
symbian的编译要求比较奇怪
它需要一个bld.inf文件与一个mmp文件
bld.inf声明build的相关信息 通常只包括这次build会引用到的mmp文件
.mmp文件保存工程与makefile相关的信息 用于具体的build过程 它也叫makmakefile project ,也就是创建makefile的文件
bld.inf的文件名是固定的
.mmp文件的文件名则根据不同的工程而起不同的名字
下面是hellotext工程中这两个文件的内容
CODE
//  BLD.INF
PRJ_MMPFILES
hellotext.mmp
CODE
//  hellotext.mmp
TARGET      HelloText.exe
TARGETTYPE  exe
SOURCEPATH  .
UID         0
SOURCE      hellotext.cpp
USERINCLUDE .
SYSTEMINCLUDE   /epoc32/include
LIBRARY     euser.lib
把上面两个文件保存到与hellotext.cpp相同的目录下
编译过程:
1 打开一个dos窗口
2 cd 到hellotext.cpp所在目录
3 运行下面命令
bldmake bldfiles
abld build wins udeb
运行完后 你就可以到
epoc/release/wins/udeb目录下查找hellotext.exe文件
//  BLD.INF
PRJ_MMPFILES
hellotext.mmp
bld.inf只是声明这个build需要调用hellotext.mmp模块

CODE
// hellotext.mmp
TARGET HelloText.exe 生成的应用程序名是hellotext.exe
TARGETTYPE exe 生成的应用程序类型是exe类型,在symbian上可运行的程序类型有exe与app,另外还支持生成其它类型文件,如dll
SOURCEPATH . 在哪里查找源文件 这里指示是在当前目录下
UID 0 对exe程序不需要指定,这里写0
SOURCE hellotext.cpp 生成应用程序需要的源文件,这里是hellotext.cpp 可以有多个source 一直照这样的格式写就可以
USERINCLUDE . 用户自定义的头文件在哪里查找 这里是当前目录
SYSTEMINCLUDE /epoc32/include 系统头文件在哪里查找 一般都是这个值
LIBRARY euser.lib 需要链接的库 这是euser.lib

symbian的开发环境是使用perl开发的
所以需要有一个确定的文件名声明工程内容 这就是bld.inf
bldmake编译时先读bld.inf 看需要哪个文件指导编译过程
然后对mmp文件进行转换,生成makefile及其它相关的编译规则文件 同时在当前目录下生成abld.bat文件
后面就是使用abld进行具体编译
bld.inf意义就是 build info.编译信息
mmp文件就是 makmake file
bldmake 就是build make info


bldmake bldfiles 创建build files
abld build wins udeb 创建win simulator unicode debug 版本

另外可能用的其它两个命令是
bldmake clean 清除生成的build file,这在改变mmp文件后应该做
abld reallyclean 清除生成的目标文件(.o) 这在改变源文件内容后使用


symbian 模拟器样子
在命令行下输入epoc得到
如果没钱买智能手机 如p910 那可以拿这个来体会一下效果




刚才编译好的程序的运行
运行epoc/release/wins/udeb/hellotext.exe 看到
没有抓图工具 无法上传
代码说明
因为手机上没有dos或是xterm窗口,所以需要声明一个console类,
打开一个控制台窗口
LOCAL_D CConsoleBase* gConsole;
//  Real main function
void MainL()
{
控制台打印
 gConsole->Printf(_L"hello world");
}
//  Console harness
void ConsoleMainL()
{
NewL类似标准c中的new 由于symbian中没有异常,
使用leave trapd代替标准c++中throw catch,
所以如果函数可能会leave的话 函数名后会加上一个L  
 gConsole    = Console::NewL(_L("Hello Text"),
         TSize(KConsFullScreen,KConsFullScreen));
symbian中为了避免资源泻漏 使用cleanupstack把需要释放的内容放到cleanupstack中,
当程序非法退出时 symbian操作系统会自动通过cleanupstack来对资源进行释放
保证资源的释放放是重要的
因为symbian可用的资源并不多 内存现在最多也就16M
而它可能一直运行好几个月(想看如果你不常关机的话)
 CleanupStack::PushL(gConsole);
调用自己的函数
 MainL();
停止5秒 让你看到屏幕显示
 User::After(5000000);
手动释放刚才申请的资源
 CleanupStack::PopAndDestroy(gConsole);
}
symbian中exe程序的入口定义如下GLDEF_C TInt    E32Main
而不是标准C中的的main
可以认为symbian自己定义了main函数,
然后在里面进行自己的初始化
初始化完后再调用E32main
(在psos下开发时也是这样 psos的入口函数是root 在其它实时系统开发与普通系统不同
因为可能需要特殊的初始化 )
GLDEF_C TInt    E32Main()
{
 __UHEAP_MARK;定义堆保护 保证程序退出时会释放资源
创建清除堆栈类
 CTrapCleanup* cleanupStack  = CTrapCleanup::New();
 TRAPD(error,ConsoleMainL());  这个相当于标准c++中的catch(...)
 __ASSERT_ALWAYS(!error,User::Panic(_L("SCMP"),error));
 delete cleanupStack;
 __UHEAP_MARKEND; 堆保护完成 在这里释放掉所有内存
 return 0;
}
结合上面的代码看symbian提供的机制
Leave , trap,cleanupstack ,heapmarking 都存在了

这是一个典型的symbian程序都会使用到的功能



函数是不是会Leave 这个在symbian中是以函数名的形式提供
函数名后面是L的表示它会Leave 函数名后面是LC的表示它会Leave,并且已经把指针push到cleanupstack中了

leave的情况:
是不是任何情况都会Leave呢
当然不是 只有资源申请失败或是操作失败时时会Leave 在系统库提供的函数是这样的

一般它也会提供不Leave的相同功能的函数
如Defined in TDesC8: 看TDesc8的类说明
Alloc(), AllocL(), AllocLC(), Compare(), CompareC(), CompareF(), Find(), Find(), FindC(), FindC(), FindF(), FindF(), Left(), Length(), Locate(), LocateF(), LocateReverse(), LocateReverseF(), Match(), MatchC(), MatchF(), Mid(), Mid(), Ptr(), Right(), Size(), operator!=(), operator<(), operator<=(), operator==(), operator>(), operator>=(), operator[]()

这里提供了Alloc()和AllocL()
看它们的说明
Alloc()
HBufC8* Alloc() const;
Description
Creates a new 8 bit heap descriptor and initialises it with a copy of this descriptor's data.

Return value
HBufC8* A pointer to the new 8 bit heap descriptor, if creation is successful. NULL, if creation of the descriptor fails.




--------------------------------------------------------------------------------

AllocL()
HBufC8* AllocL() const;
Description
Creates a new 8 bit heap descriptor and initialises it with a copy of this descriptor's data.

The function leaves, if creation of the descriptor fails.

Return value
HBufC8* A pointer to the 8 bit heap descriptor, if creation is successful.



See also:
Creating a heap descriptor

AllocLC()
HBufC8* AllocLC() const;
Description
Creates a new 8 bit heap descriptor and initialises it with a copy of this descriptor's data

The function leaves, if creation of the descriptor fails.

Return value
HBufC8* A pointer to the 8 bit heap descriptor, if creation is successful. The pointer is also put onto the cleanup stack.


对其它函数也一样

可以根据自己的需要来调用带L或是不带L的函数

必然会有不带L的函数 可能有带L的相同功能函数
其实上面还有一个特殊的符号 那就是_L
在symbian中是使用描述符的概念,与普通c/c++程序中字符串的概念不一样
后面会介绍它

下面介绍symbian的系统结构

//=======================================================
//
// 第二部分:系统结构
//
//=======================================================
CODE

在symbian os上运行的四种软件
  应用程序
  服务
  引擎
  内核
symbian系统使用活动对象与客户-服务器对事件处理系统进行了优化
硬件资源:
  一个cpu,32位arm
  一个rom(只读存储器),里面有操作系统与内建的中间件和应用程序
  ROM盘被映射到z:盘,所有的文件都可以通过Z:盘访问。
  系统RAM.系统RAM用于两个方面,一是被当前活动的程序和系统核心使用,另一个是当成"C"盘的磁盘空间。这两个部分的大小是变化的,不可以保留某个的大小。由于RAM通常只有8MB到16MB,所以内存可能用完,因此经常出现内存越界错误或是(写文件时)磁盘已满错误
  IO设备,包括带数字笔输入的触摸屏,键盘,记忆卡(被当成D盘),rs232串口,红外口,蓝牙。
  电源,包括电池与外接电源

symbian os与pc系统的区别如下:
  资源限制:cpu太慢与太少内存
  没有硬盘,不能使用写到硬盘的虚拟内存,不能保证有足够的空间保存程序或是数据文件
  电源条件严格.


symbian软件环境如下:

server  |   server| Application|  Application | Application     Dll
      |         |            -----------------------    boundary
      |         |            |              |
      |         |            |  Enghine     |  Engine
-------------------------------------------------   Privilege
                                                              boundary
                  Kernel


kernel工作在高级别,管理机器所有硬件资源。对其它软件模块提供访问这些硬件资源的接口
其它应用程序工作在用户模式
上面如果理解普通操作系统如linux的话,那跟普通操作系统没有区别
应用程序是一个有用户界面的程序,在独立的进程中运行
这与普通操作系统也没有区别
服务是没有用户界面的程序.服务管理一个或多个资源,并提供api,让客户可以访问它的服务.服务的客户可以是一个程序或是其它服务.每个服务也运行在独立的进程空间中。
在symbian中,使用服务的形式提供类似其它操作系统上用驱动程序或是内核程序提供的功能。如文件系统的访问也是客户/服务类型的。(微内核:P)
引擎是一个应用程序中操作数据而不是与用户交互的部分.通常你可以把一个程序分成引擎部分和一个GUI部分,多部symbian内带的程序都是这样做的。
一个应用程序引擎可以是一个独立的代码模块或是一个独立的dll,或是几个dll.
引擎和应用程序间的边界是模块或dll的边界。

所以在symbian中有四个组件类型与三个边界类型。dll或是模块组件对交叉引用来说很方便。它们使系统模块化与保持封装。
权限边界对交叉引用比较费资源,但是保证系统对用户太程序隐藏内核与设备
进程边界是所有的交叉中最昂贵的,它们保证在ram中分开每个程序


CODE

可执行文件的格式
在symbian中有两种类型的可执行文件:
exe,每个程序都有一个主入口E32main()(看上面的例子),它在独立的进程中运行
dll,提供多个入口,由系统或是已存在的线程(进程)调用
有两种类型的dll,
共享库dll,为一个或多个程序提供固定的api,这些dll多数后缀是.dll,当程序启动时就被读到内存中。
多态dll,这些dll实现抽象的api,如一个打印机驱动,socket协议或是一个应用程序。它们的扩展名多不是.dll,而是.prn或.prt或.app等。它们从与dll相关的类继承,并通常只有在程序需要它们时才读入。

从技术上看起来与普通系统上动态库的静态载入与动态载入没有区别
但是从功能上看就不一样了,一种是实现某种特殊功能的,从某个相关类继承的dll,另一个是普通dll


代码执行
如果程序代码在rom上,则直接执行,不然需要读到ram中(与普通操作系统不同,普通操作系统都需要读到ram中
不能直接在硬盘上执行)
可执行代码包括三种类型的二进制数据:
程序代码
只读静态数据
可写静态数据
在symbian中对待.exe与.dll是不同的
由于.exe是不可共享的,如果它在ram中执行,那与普通pc系统没有区别,如果在ram中执行,那它在ram中为可写静态数据分配内存
而.dll是共享的,当dll首次读入内存中时,它被分配到一个特殊的地址,第二个线程需要这个dll时它只要访问已经存在的这份copy就可以。在所有使用它的进程中dll的地址都是相同的。symbian系统维护一个引用计数,当没有其它线程引用时才将它unload.
在rom上的dll像rom上的exe一样直接在rom上执行

为了对dll的大小进行优化,symbbian进行如下操作;
  多数系统支持通过名字与通过数字访问dll提供的入口,由于名字太长,浪费空间,所以symbian只提供通过数字访问,当然在link时可以通过名字 link.也就是说在.dll中没有名字访问办法,在.lib(引导库,引导linker正确的link这个dll,这个是在windows中使用的概念,在win下每创建一个dll都会创建一个用户引导链接的同名.lib)中有,你的程序link时link的是.lib,link完成后编译器会自动把引用dll的代码变成数字引用
如果dll被读到ram,那重定位信息(把dll
load到什么地址)也必须包含在可执行文件格式中,这个的影响就是你不能把一个在rom中执行的程序放到ram中执行的程序.(rom中执行的多是oem厂家,所以普通开发者多不用关心)


多数应用程序有自己有exe来创建进程,其它的程序使用动态库(DL)L的形式,在主服务线程中调用自己的线程
多数gui程序都是多态(polymorphic)dll,有一个主入口点NewApplication(),这个入口点创建并返回一个继承自CEikAppication的对象.这样的程序被apprun.exe调用,app文件名为参数传入。

电源管理
  电源必须高效使用
  在系统已经关机时,确定程序仍然可以运行。如闹钤,关机后,到时时仍然可以开机
  电源突然关掉时,关键数据应该可以保存

设备驱动
  虽然一般不会了解它,但是理解一下还是很有用的
  设备驱动工作在两个级别
  第一个是中断服务程序(ISR),ISR必须很短,并且不能做很多事情,因为它可能在任何时间出现,甚至在内核服务中。通常它只是通知设备产生了中断并设置一个标志,要求内核为第二阶段的处理运行一个延迟的函数调用(delayed function call DFC)
  在方便的时候内核调度DFC.DFC可以使用多数的核心api,通常只是工作了后向用户线程通知io操作已经完成

定时器
`   内核支持真机上64hz的时钟与模拟器上10hz的时钟
  时钟中断是最高优先级中断,它可以通过User::After或是RTime::After访问。时钟中断在关机时停止,所以如果你请求5s后的定时操作,然后跑2s,关机,再开机时它也要等3s
  内核同时支持日期/时间时钟,你可以使用User::At或是RTime::At。这个定时器很准确。在关机时,如果时间到了,那它会开机,这对闹钟很合适。

内存
  symbian使用内存管理单元(memory management unit MMU)管理内存
  ROM被映射到z:盘,被映射到一个固定的地址。
  物理RAM被MMU分在4k的页,每个物理页可以用于:
      用户进程的虚地址空间。
      内核服务的虚地址空间
      ram盘,盘符是c:,ram盘只可通过文件服务进程访问
      如果dll不在rom中,那它被读到ram,dll被读到ram里面后页面标记为只读只读的。
      MMU的页面转换表.如果想理解的话学习一下操作系统原理
      自由页表
第一部分总结

上面介绍了基本的入门程序与symbian的结构

从基本的入门程序中可以看到一个程序的基本结构
那就是从
E32main开始
使用cleanupstack保护要执行的代码

相对于c++而言 语言级不支持throw 和catch,所以定义了函数User::Leave与宏trap保护 并且使用cleanupstack保证程序退出时资源的正确释放

第二部分介绍了symbian的结构与设备特点 后面会继续介绍

另外nokia的ng 也是使用symbian操作系统 使用的是s60系统
后面会介绍到它的不同

如果高兴的话 可以买个s60回来 自己给它写游戏
symbian相关学习的代码
http://www.symbian.com/books/scmp/scmp-source.html

安装uiq sdk(最新版是2.1 可以从www.uiq.com免费下载)后
下载它们 解压到一个目录

然后在有bld.inf的目录下开始执行

bldmake bldfiles
abld build wins udeb

(这些命令的语法已经在上面说明过一次)
wins表示是创建windows模拟器 对应的还有armi 结构 这是表示生成真机上 可执行文件
udeb表示是unicode的debug版 对应的有urel 表示unicode的release版

另外
上面是symbian mobile:c++ program的例子 在前一页提供一个链接可以下载第一章 可以拿来看看



//==============================================
// 可执行文件格式
//==============================================
可执行文件的格式
在symbian中有两种类型的可执行文件:
exe,每个程序都有一个主入口E32main()(看上面的例子),它在独立的进程中运行
dll,提供多个入口,由系统或是已存在的线程(进程)调用
有两种类型的dll,
共享库dll,为一个或多个程序提供固定的api,这些dll多数后缀是.dll,当程序启动时就被读到内存中。
多态dll,这些dll实现抽象的api,如一个打印机驱动,socket协议或是一个应用程序。它们的扩展名多不是.dll,而是.prn或.prt或.app等。它们从与dll相关的类继承,并通常只有在程序需要它们时才读入。

从技术上看起来与普通系统上动态库的静态载入与动态载入没有区别
但是从功能上看就不一样了,一种是实现某种特殊功能的,从某个相关类继承的dll,另一个是普通dll


代码执行
如果程序代码在rom上,则直接执行,不然需要读到ram中(与普通操作系统不同,普通操作系统都需要读到ram中
不能直接在硬盘上执行)
可执行代码包括三种类型的二进制数据:
程序代码
只读静态数据
可写静态数据
在symbian中对待.exe与.dll是不同的
由于.exe是不可共享的,如果它在ram中执行,那与普通pc系统没有区别,如果在ram中执行,那它在ram中为可写静态数据分配内存
而.dll是共享的,当dll首次读入内存中时,它被分配到一个特殊的地址,第二个线程需要这个dll时它只要访问已经存在的这份copy就可以。在所有使用它的进程中dll的地址都是相同的。symbian系统维护一个引用计数,当没有其它线程引用时才将它unload.
在rom上的dll像rom上的exe一样直接在rom上执行

为了对dll的大小进行优化,symbbian进行如下操作;
多数系统支持通过名字与通过数字访问dll提供的入口,由于名字太长,浪费空间,所以symbian只提供通过数字访问,当然在link时可以通过名字 link.也就是说在.dll中没有名字访问办法,在.lib(引导库,引导linker正确的link这个dll,这个是在windows中使用的概念,在win下每创建一个dll都会创建一个用户引导链接的同名.lib)中有,你的程序link时link的是.lib,link完成后编译器会自动把引用dll的代码变成数字引用
如果dll被读到ram,那重定位信息(把dll
load到什么地址)也必须包含在可执行文件格式中,这个的影响就是你不能把一个在rom中执行的程序放到ram中执行的程序.(rom中执行的多是oem厂家,所以普通开发者多不用关心)


多数应用程序有自己有exe来创建进程,其它的程序使用动态库(DL)L的形式,在主服务线程中调用自己的线程
多数gui程序都是多态(polymorphic)dll,有一个主入口点NewApplication(),这个入口点创建并返回一个继承自CEikAppication的对象.这样的程序被apprun.exe调用,app文件名为参数传入
在syjmbian中可以在rom执行

并且dll也算可执行程序

这样看起来确实是比较奇怪

但是
symbian是一个手机操作系统 资源不是很多

使用dll 只需要在一个线程中执行

而线程的开销比进程少的多

无论是在内存(每个进程都有独立的内存,而线程共享进程的内存与资源) 还是进程间通信的方面 线程的开销都比进程少的多

在rom中可执行代码也是因为手机内存很少(还没有达到128M)

在rom中也可以执行引起了symbian与其它系统的两个不同
第一 就是dll不可以有可写的静态变量 因为如果dll在rom上 它不需要读到内存 所以无法改写
第二 就是rom上exe文件执行时 只需要把可写的变量放到ram中 这也表示可以在exe中使用静态可写变量


在symbian中
dll的作用很大

如普通的gui程序 都是dll

它们由apprun.exe调用 作为参数

另外还有其它功能
如内核逻辑设备驱动(ldd) 也是
还有文件关联库(mdl 打开某个文件类型时自动调用)


而exe一般只用于写服务器程序

(在symbian中广泛使用客户/服务器模式 所以你也可以只把部分写成服务器 其它的写成客户端请求服务器的服务 实现你的软件)


 [主题]:介绍一下symbian与ppc(ms smartphone)手机区别

  symbian与ms smartphone是两个不同的手机平台
  现在symbian的市场占有率是60% ms和其它手机系统占智能手机的30%多
  同时symbian上软件ms的3倍 销售额也是2倍以上 nokia推出了与开发者合作的计划 所以symbian上的应用软件在不断增加 而且很多都很好玩

  另外可操作性与资源消耗量(如cpu要求 内存要求 待机) 这些都是ms的弱点
  所以到现在一直无法在市场上增加份额(手机只能用一天 那这样的手机不知道有什么bt会买) 而symbian因此可以以更少的资源做更多的事 同时也在市场上不断增加份额

由于ms smartphone操作系统使用的资源更多 所以厂家无法在硬件上降低成本
所以ms的手机 如果可以跑的比较流畅 那价格应该都会比symbian手机多

  nokia的s系列与索爱的p系列只是symbian上两个不同的界面 这两种界面都可以跑symbian程序

  以后的发展 硬件在不断发展 同时ms的开发速度与pc上开发差不多
  不过我想 还会是symbian强 因为现在symbian上的软件积累不知道要比wince上多多少

  另外为了改变symbian一向是高价机的形象 nokia推出了ng系列低价手机 吸引广大玩家进入 同时丰富symbian上的应用

从ng的火热可以看到 后面的结果应该是symbian开发的天下

你可能感兴趣的:(SymbianOS)