3650进阶篇之四----Symbian开发入门( 二 )


如果要在VC6里编译和运行HelloWorld,在运行完bldmake bldfiles后,运行abld makefile vc6,则会生成vc6的dsw文件,位置在 C:Symbian6.1Series60Epoc32BUILDSYMBIAN6.1SERIES60SERIES60EXHELLOWORLDGROUPHELLOWORLDWINS
看Symbian把这点事搞得这么麻烦,也真是不容易 。
如果要直接在vc6里创建新项目的话,要把 C:Symbian6.1Series60Series60Tools目录下的文件拷贝到vc6的模板目录下才可以 。
折腾到这里,可能得花2个多小时吧,接下的时间看看文档了 。
先看看HelloWorld的帮助文档,理解一下Symbian程序的体系结构 。Symbian程序也是按照VC的文档视图结构来组织程序的,有Application类CAknApplication,有Document类CAknDocument,有Frame类CAknAppUi,有视图类CCoeControl等,跟vc的结构好像是差不多的,但感觉上它的Document类好像是做样子的,我还没看到这一块 。关于这些类之间的调用关系,在HelloWorld的文档里有个顺序图非常好,一看便知 。
在看Symbian的代码时,感觉最不适应的可能就是经常看到PushL和Pop函数,还有就是很多的函数都有L或LC的后缀 。其实这是Symbian的例外处理机制 。比如说我们定义了一个指针,给它分配了空间,可是在使用它的时候程序突然间出现了致命错误中止了,那这个指针占用的地址空间我们肯定是收不回来了,在PC上编程这一点可能问题不大,内存那么多,而且用不了多长时间就重启动了,但是Symbian的设计者可能认为这在手机上是不行的,所以对这一点做了很多的设计 。
Symbian有一个Clean up stack,在使用指针时,用PushL把指针压入栈中,使用完后在用Pop弹出栈,如果在中间调用可能导致崩溃的函数时果真出现了问题,那么Clean up stack可以通过调用该指针的析构函数回收占用的空间 。这些可能导致崩溃的函数在Symbian里被称为可能Leave的函数,所以就在这些函数的尾部加了一个L 。而加LC后缀的函数表明该函数已经在内部把指针用PushL压入clean up stack了,调用时无需再用PushL,直接调用完用Pop既可 。Clean up stack还提供了一个PopAndDestroy函数,就是弹出栈后再销毁指针 。顺便提一句,正式因为有了Clean up stack机制,所以Symbian在有些地方看起来跟VC的程序不太一样,比如说很多类的构造函数都不用,用NewL或NewLC构造,分配地址时的操作符new()也变成了new(ELeave) 。上述内容可以看一下Symbian编程基础中的内存管理一节 。
Symbian自己定义了一堆的数据类型,如果不想找麻烦的话,还是乖乖的用这些类型的好 。简单说一下,整型有TInt和TUint,其中又分为8位的,16位的和32位的,如TInt8,TInt16,TInt32;文本类型是TText,又细分为TText8和TText16,但内部都是Unicode的,所以实际上内部引用应该都是TText16;bool型是TBool,对应的值有ETrue和EFalse;浮点型是TReal,但又分为TReal32和TReal64;还有一个引用类型TRefByvalue,是以模板类的形式提供的 。
因为Symbian是冲着更面向对象设计的,所以在我们常见的字符串这块变化比较大,在Symbian里叫descriptor 。最底层的是两个抽象类TDesC和TDes,实际上TDes也是继承的TDesC,TDesC中的C字母是常量constant的意思 。即带C字母结束的都是定义的常量,是不可以修改的,而不带C的都有一个最大长度的限制,是可以修改的,下面也是同样的道理 。指针描述符是TPtrC和TPtr,类似于C中的char *;缓冲区描述符(Buffer descriptor)是TBufC和TBuf,类似于char [];堆描述符是HBufC,类似于(char *)malloc(length 1)的用法 。具体用时,上述的类型又分为8位的和16位的 。举个例子:
TBuf<64> buf;
CEikonEnv::Static()->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );
先定义了一个最大长度是64的缓冲区,然后读入名为R_EXAMPLE_VIEW_TITLE的资源 。
再例如:

推荐阅读