二进制类型

 包括两种类型:以新进程的方式被启动的的包(.exe)以及那些运行于已经存在的进程中的动态链接库(.dll)。

Symbian OS的EXE

在Windows模拟器上,存在一个Win32进程EPOC.exe,在该进程中,每个Symbian OS的EXE都被放在一个单独的线程中加以模拟。在目标设备上,每个EXE是在一个单独的、全新的进程中被启动的,每个进程有一个单独的线程来调用惟一入口点函数E32Main()。

可执行代码可以安装在ROM中,此时EXE可以直接从ROM中就地执行,这意味着程序代码和只读数据可以从ROM中直接读取,组件只需要在RAM中为其可读写数据分配一个单独的数据区就可以了。 如果EXE被安装在非ROM中,那么它需要全部放入RAM中来执行,而且需要为程序代码和只读静态数据分配一个区域,还要为可读性的静态数据分配一个单独的区域。如果启动了EXE的第二份副本,则程序代码和只读静态数据区域会被共享,只需再为其分配可读性数据区。

Symbian OS的DLL

Symbian OS中的DLL有两类:共享库DLL和多态DLL。
共享库DLL实现了可能会被多个各种类型组件(dll/exe)所使用的库代码。以.dll为扩展名,基本用户库EUser.dll和文件系统库EFile.dll就是共享库的例子。一个共享库会根据模块定义文件(.def)导出API函数。每个函数都是DLL的一个入口点。共享库还向其他组件发布头文件(.h)和导入库(.lib),使得其他组件可以使用头文件来进行编译,然后可以链接上导入库,从而可以解析到那些导出函数。

多态DLL,实现一个抽象接口,该接口通常是单独定义的。可以具有.dll扩展名,但通常会使用能够进一步表达DLL本质的扩展名,例如,.app表示应用程序,.fep表示前端处理器,.mdl表示识别器。多态DLL有一个单独的入口点,导出索引为1的"gate"或"factory"函数,该函数可以将实现接口的具体类实例化。接口函数是虚函数,它们不被导出,而是通过指向基类接口的指针由虚函数表来访问的。多态DLL通常用于提供一个统一接口的一系列不同实现,而且它是在运行期由RLibrary::Load()调用动态载入的。

对于静态和多态DLL,代码段都是被共享的。ROM中的DLL不会被载入到内存中,它们会以固定的地址在ROM中执行。从RAM中运行的DLL会被载入到特定地址,并且会进行引用计数,当不再被使用时才会被卸载。

多数OS在载入动态库时,DLL入口点既可以通过字符串匹配(按名字查找),又可以通过它们被导出的顺序(按序号查找)来识别。Symbain中为了节省开销,不支持按名字查找,按序号查找对于二进制兼容性具有重大意义,在两个发行版的DLL之间,序号一定不能被改变。

可写的静态数据


EXE组件具有分离的含有程序代码、只读数据和可写数据的数据区,而DLL没有后者。Symbian OS的DLL不支持可写的全局数据。
为什么DLL没有可写的数据区?原因在于任何引用了全局数据的代码都必须采用地址而不是从指针得出的偏移量来访问。当代码被加载时,它必须使用DLL中某处的固定地址来定位数据,或者如果它被移动到了新地址,就要对数据使用重定位值。另外,因为DLL会在进程间被共享,所以每个加载了它的进程都必须使用相同的地址来访问全局数据。如果在DLL被装载时,数据所要求的地址已经被占用了,那么DLL将不可用。

因此,像Singleton Pattern这样的示例就不可以在DLL中实现。在DLL中可以使用的全局数据仅有内建类型或没有构造函数的类的全局常量数据,如:
static const TUid KUidClangerDll = { 0x1000C001 };
static const TInt KMinValue = 5;
不可以使用这些数据:
static const TPoint KPnt(10, 10);
static const TPtrC KInput = _L("");
static const TChar KExclamation('!');
注意,下面的对象也是非常量的,尽管由pClanger指向的数据为常量,但指针本身不是常量:
static const TText* pClanger = (const TText*)"clanger";
应该使用下面的形式:
static const TText* const pClanger = (const TText*)"clanger";

如果在代码中不经意使用了非常量的全局数据,那么在模拟器中这个问题是不会被发现的,但在目标硬件中会产生问题。

Symbian OS的DLL必须不能包含可写的全局或静态数据。仅有的可以在DLL中使用的全局数据是常量,而且必须是内建类型的常量或是无构造函数类的常量。

UID

UID是一个有符号32位值,它被当作全局惟一标识符来使用。Symbian OS使用三个UID联合创建TUidType复合标识符。它用来标识组件类型并且用于验证它是否兼容及支持特定的接口。DLL装载器会检查DLL的类型(RLibrary::Type()),从而判断一个组件是否具有正确的类型,并且防止共享相同名字的其他文件被装载。

TUidType中的三个UID被标识为UID1、UID2和UID3,它们的含义如下:
UID1是系统级标识符,它用于分辨EXE(KExecutableImageUid = 0x1000007a)和DLL(KDynamicLibraryUid = 0x10000079)
UID2用于区别具有相同UID1的组件,例如:区别共享库(KSharedLibraryUid = 0x1000008d)和多态DLL,诸如应用程序,识别器或前端处理器
UID3惟一标识组件

无需为一个组件指定UID1,因为它是根据组件选择的targettype来隐式定义的;使用组件的UID2和UID3时,必须以16进制值的形式在组件的.mmp文件中对这两个UID加以指定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值