英文原文链接:http://wiki.forum.nokia.com/index.php/Writeable_static_data
可写静态数据
全局可写静态数据(Global Writeable Static Data,WSD) 就是在整个进程的生命周期内都存在的预处理变量。有时候我们需要WSD定义变量给其他的文件使用。这种情况时常发生在将非Symbian操作系统环境的代码移植到Symbian系统中来的时候。
EKA1上的WSD
在Symbian系统版本6.1, 7.0, 7.0s, 8.0a, 8.1a的内核架构EKA1中,仅仅在EXE类型的程序中支持WSD。我们不能在DLL和APP中使用WSD,如果我们进行了这样的定义,编译器会报告"初始化数据" 错误信息。
在EKA1中,我们如果要使用WSD的话,有下面这些解决办法:
(1), 使用本地线程存储(TLS,Thread Local Storage) 。 在Symbian的FAQ和技术技巧 里面有例子关于怎么用TLS来定义WSD。
(2), 将全局变量变成类成员变量 。这个方法有很大的工作量,尤其是WSD在很多不同地方被使用的情况下。
(3), 使用ECompXL 。尽管ECompXL是被用来压缩Symbian系统的可执行程序文件的,但是他的一个"副作用"可以让开发者把它用来当作WSD使用。
EKA2上的WSD
在Symbian系统版本8.0b, 8.1b及其版本9以后的内核中,EXE和DLL都 支持使用WSD。不过尽管如此,在DLL中使用WSD仍然需要作一些小的修改, 需要在MMP文件中添加如下宏定义:
EPOCALLOWDLLDATA
不过,这是有代价的。当在EKA2上使用WSD的时候需要仔细考虑以下列出的情况:
(1) EKA2的模拟器上仅仅允许有WSD的DLL被一个进程装载 。 (最 近做的项目中就遇到了这个问题,一个有WSD的DLL被两个exe调用导致这个两个exe不能相互调转切换,提示feature not supported, 呵呵~~)
(2) WSD数据块占用RAM空间
(3) 在ARMv5上块是一种有限的资源
(4) 一个进程中有WSD的DLL的数目是受限的。
参考
Symbian OS support for writeable static data in DLLs (PDF format)
Static data on Symbian OS 9.1 documentation.