第1章 起步 1
1.1使用仿真器 1
1.1.1启动仿真器 1
1.1.2GUI样式 2
1.2HelloWorld之文本版本 4
1.2.1程序hellotext 5
1.2.2项目规范文件 7
1.2.3组件定义文件 8
1.2.4从命令行生成 8
1.2.5使用多个SDK 10
1.2.6在Carbide.c++IDE中生成 10
1.3小结 10
第2章 Symbian操作系统概述 12
2.1Symbian操作系统基础 12
2.1.1关于内核 13
2.1.2线程和进程模型 16
2.1.3用户内存及内存管理 17
2.1.4Symbian操作系统服务器 17
2.1.5Symbian操作系统进程间通信 18
2.1.6电源管理 18
2.1.7定时器 19
2.1.8可执行程序和共享库 19
2.1.9可写静态数据的优化 20
2.1.10文件和文件系统 20
2.1.11平台安全 21
2.2框架基础 21
2.2.1Symbian操作系统C++ 21
2.2.2并发和活动对象 21
2.2.3Symbian操作系统C++异常处理 24
2.2.4Symbian操作系统C++命名规则 25
2.3本书覆盖的API 26
2.4小结 27
第3章 Symbian操作系统C++ 28
3.1基本数据类型 28
3.2命名约定 29
3.2.1类名 29
3.2.2数据名 30
3.2.3函数名 30
3.2.4宏名 31
3.2.5间隔(Indentation)、分行(LineBreaks)和括号(Bracketing) 31
3.3函数 33
3.4API 34
3.4.1函数类型 35
3.4.2DLL和其他API元素 35
3.4.3导出函数 36
3.4.4虚函数和API 36
3.5模板 37
3.5.1瘦模板模式 37
3.5.2模板中的数字 38
3.6类型转换 38
3.7类 38
3.7.1接口 39
3.7.2不良做法 39
3.8设计模式 40
3.9小结 40
第4章 对象——内存管理、清理和错误处理 42
4.1对象的创建与销毁 42
4.1.1堆(动态对象) 43
4.1.2程序栈(自动对象) 44
4.2Symbian操作系统中的类的分类 45
4.2.1T类和C类 45
4.2.2R类 46
4.2.3M类 47
4.3错误处理 48
4.3.1框架能处理的错误类型 48
4.3.2严重错误 49
4.3.3异常退出与捕获机制 50
4.4清理栈 51
4.4.1使用清理栈 52
4.4.2不必要时不要使用清理栈 53
4.4.3如果CleanupStack∷PushL()失败怎么办 54
4.4.4CBase和清理栈 54
4.4.5清理栈上的R类 54
4.5两阶段构造 55
4.5.1分离安全构造和不安全构造 55
4.5.2在NewL()和NewLC()中封装ConstructL() 57
4.6小结 58
第5章 描述符 59
5.1概述 59
5.2描述符内部结构 61
5.3文字 63
5.4栈描述符 63
5.5指针描述符 64
5.5.1TPtrC描述符 65
5.5.2类型2TPtr描述符 65
5.5.3类型4TPtr描述符 66
5.5.4使用TPtr∷Set() 66
5.6堆描述符 67
5.6.1HBuf描述符 67
5.6.2RBuf描述符 69
5.7窄、宽、中性的描述符 73
5.8描述符和二进制数据 74
5.9描述符函数 75
5.9.1描述符作为参数 75
5.9.2从函数中返回描述符 78
5.10描述符的一些操作 83
5.10.1描述符和文本控制台 83
5.10.2转换描述符到数字 84
5.10.3转换数字到描述符 84
5.10.4外部化和内部化描述符 84
5.10.5把二进制数据放到_LIT 85
5.10.6描述符和字符串的转换 85
5.11描述符的正确使用 88
5.11.1不要声明TDesC或者Tdes变量 88
5.11.2以引用传递TDesC和TDes 88
5.11.3声明TDesC时不要忽略了const 89
5.11.4运行时不要设置缓冲描述符的大小 89
5.11.5不要将大的栈描述符放置在栈上 89
5.11.6不要在堆上分配大的栈描述符 90
5.11.7警惕TPtr∷=()(操作符) 90
5.11.8警惕TPtr和C++传统不一致处 90
5.11.9正确使用HBufC∷Des() 91
5.11.10从描述符创建HBufC时使用Alloc() 91
5.11.11警惕HBufC∷ReAllocL()和HBufC∷ReAlloc() 91
5.11.12格式化时注意%s和%S的区别 93
5.12操控描述符 95
5.12.1折叠比较 95
5.12.2校对比较 95
5.12.3基本函数 96
5.12.4操作数据 96
5.12.5子字符串函数 96
5.12.6格式化 96
5.12.7TDesC函数 97
5.12.8TDes函数 97
5.12.9HBufC函数 99
5.12.10RBuf函数 99
5.12.11TBuf函数 100
5.12.12TBufC函数 100
5.12.13TPtr函数 100
5.12.14TPtrC函数 100
5.13小结 101
第6章 活动对象 102
6.1异步服务 102
6.1.1初始化阶段 103
6.1.2等待阶段1 104
6.1.3键盘事件调度阶段 104
6.1.4等待阶段2 105
6.1.5定时器事件调度阶段 105
6.1.6等待阶段3 105
6.2多任务处理和抢占 105
6.3更深入地研究活动对象 106
6.3.1“Sethello”菜单项 107
6.3.2“Startflashing”菜单项 111
6.4工作方式 112
6.5活动对象优先级 115
6.6取消活动对象 118
6.6.1处理一个不能运行的请求 119
6.6.2正常处理后完成请求 119
6.6.3取消请求发生较早 120
6.6.4取消请求发生较晚 121
6.6.5服务提供者异常终止时取消请求 121
6.6.6异步服务器资源耗尽时取消请求 121
6.7启动和终止调度器 122
6.8理解游离信号 122
6.8.1忘记设置对象为激活的 122
6.8.2忘记设置请求为挂起 123
6.8.3第二个请求 123
6.8.4完成请求两次 123
6.8.5以KRequestPending完成请求 124
6.8.6设置已完成的请求的状态为KRequestPending 124
6.8.7使用RThread∷RequestSignal()和活动对象框架 125
6.8.8使用活动对象并调用User∷WaitForRequest() 125
6.8.9将未完成活动对象从队列中移出 125
6.8.10做出异步请求后调用异常退出函数 125
6.9其他常见活动对象错误 126
6.9.1直接调用DoCancel() 126
6.9.2从析构函数调用Cancel()失败 126
6.9.3调用Cancel()前检查IsActive() 126
6.9.4没有正确实现DoCancel() 127
6.9.5忽略错误处理 127
6.9.6在RunL()中使用宏TRAP 127
6.9.7在自我析构的RunL()中调用异常退出代码 127
6.9.8用operator=()赋值TRequestStatus 127
6.9.9异常退出异步函数 128
6.9.10从异步函数返回错误值 128
6.10状态机 128
6.11长时间运行任务和活动对象 131
6.12小结 135
第7章 文件和文件系统 136
7.1基于文件的应用程序 136
7.2驱动盘和文件类型 137
7.3文件系统服务 137
7.3.1文件规范 137
7.3.2操作文件名 138
7.3.3文件服务器会话 138
7.3.4目录 140
7.3.5文件 141
7.3.6共享文件句柄 142
7.3.7RFileBuf 143
7.3.8结论 144
7.4流 145
7.4.1基类 145
7.4.2使用操作符<<和>> 146
7.4.3内部化和外部化 146
7.4.4写入和读取流函数 148
7.5存储 150
7.5.1创建持久性存储 152
7.5.2读取持久性存储 153
7.5.3永久性存储 154
7.5.4嵌套存储 155
7.5.5存储和应用程序架构 157
7.6词典存储和INI文件 159
7.7小结 160
第8章 进程间通信机制 162
8.1概述 162
8.1.1客户端—服务器会话IPC 162
8.1.2发布和订阅IPC 163
8.1.3消息队列IPC 165
8.2客户端—服务器IPC 166
8.2.1建立会话 167
8.2.2启动服务器 167
8.2.3使用会话 168
8.2.4清理 170
8.2.5会话和子会话 170
8.3发布和订阅IPC 171
8.3.1拥有属性 171
8.3.2使用属性 172
8.3.3决定性 173
8.4消息队列IPC 173
8.4.1创建消息队列 174
8.4.2使用消息队列 174
8.5应该使用哪种IPC机制 175
8.5.1客户端—服务器 175
8.5.2发布和订阅 175
8.5.3消息队列 176
8.6小结 176
第9章 平台安全和应用程序发布 178
9.1释放应用程序 178
9.2平台安全的工作方式 178
9.2.1能力 179
9.2.2通过Symbian签名授权 179
9.2.3不带Symbian签名授权 179
9.2.4一次性授予 180
9.3如何支持平台安全 180
9.3.1项目定义文件 180
9.3.2安全标识 180
9.3.3数据锁定 181
9.4准备发布应用程序 181
9.4.1生成应用程序 181
9.4.2产生打包文件 182
9.4.3生成最终的SIS文件 183
9.5Symbian签名概述 184
9.5.1测试标准 184
9.5.2签名或者不签名 185
9.5.3开发者证书 186
9.5.4签名流程 187
9.6安装SIS文件 188
9.7能力列表 188
9.8小结 189
第10章 调试和仿真器 190
10.1使用仿真器 190
10.1.1磁盘映射 191
10.1.2仿真器按键 192
10.1.3通信 192
10.2仿真器调试 194
10.2.1Carbide.c++IDE 194
10.2.2CodeWarriorIDE 195
10.2.3仿真器调试键 196
10.2.4仿真器设置 197
10.2.5仿真器测试证书 198
10.2.6尽可能发挥仿真器日志文件的作用 198
10.2.7日志 200
10.2.8使用eshell 201
10.2.9使用DEXC工具 202
10.2.10内存测试 203
10.3联机调试 205
10.3.1联机调试代理 205
10.3.2仿真器调试与联机调试 205
10.4其他工具 206
10.5小结 207
第11章 应用程序框架 208
11.1Symbian操作系统应用程序框架 208
11.2S60和UIQ平台应用程序框架 209
11.3图形化的“HelloWorld!”程序 210
11.3.1类结构 210
11.3.2产生示例代码 211
11.3.3项目描述文件 211
11.3.4应用程序入口 213
11.3.5Application类 213
11.3.6Document类 214
11.3.7应用程序UI 215
11.3.8应用程序视图 217
11.3.9资源文件 219
11.3.10注册文件 220
11.4小结 221
第12章 简单图形应用程序 222
12.1在S60上实现游戏 223
12.1.1应用程序类 223
12.1.2文档类 224
12.1.3应用程序UI类 224
12.1.4控制器类 227
12.1.5引擎类 230
12.1.6视图类 231
12.1.7命令菜单 237
12.2UIQ3的不同 239
12.2.1应用程序UI类 239
12.2.2视图类 240
12.2.3命令 243
12.2.4持久性 246
12.3小结 247
第13章 资源文件 248
13.1为什么需要针对Symbian的资源编译器 248
13.2资源文件语法 248
13.2.1STRUCT语句 249
13.2.2RESOURCE语句 250
13.2.3ENUM语句 251
13.2.4NAME语句 251
13.3位图和图标 251
13.3.1转换位图 253
13.3.2bmconv工具 254
13.3.3可分级的向量图形 254
13.4更新资源文件 255
13.5应用程序注册文件 255
13.6可本地化的字符串 256
13.7多资源文件 258
13.8编译资源文件 259
13.9已编译资源文件的内容 260
13.10读取资源文件 262
13.10.1通过CCoeEnv 262
13.10.2通过BAFI 262
13.11小结 263
第14章 视图和视图架构 264
14.1视图架构 264
14.1.1UIQ视图 265
14.1.2S60视图 266
14.1.3移植性 266
14.1.4应用程序UI的角色 266
14.1.5默认视图 267
14.1.6观察器 268
14.2MCoeView接口 268
14.2.1视图ID 268
14.2.2构造 269
14.2.3激活和禁用 269
14.3实例应用程序的介绍 269
14.3.1历史视图 270
14.3.2额外的S60考虑 275
14.4创建和管理视图 275
14.4.1构造和注册 275
14.4.2激活和禁用 276
14.5实现MCoeView接口 277
14.5.1视图ID 277
14.5.2激活视图 277
14.5.3禁用视图 279
14.5.4构造视图 279
14.5.5历史视图内容 280
14.6命令菜单 282
14.6.1对UIQ做出的改变 282
14.6.2对S60作出的改变 284
14.7小结 287
第15章 控件 288
15.1什么是控件 288
15.2控件类型 289
15.2.1简单控件 289
15.2.2复合控件 290
15.3控件布局 292
15.4处理键和触笔事件 294
15.4.1键事件 294
15.4.2焦点 298
15.4.3触笔事件 299
15.5观察控件 301
15.6绘制控件 302
15.7备份窗口 307
15.8后台备份窗口 308
15.9变灰控件和不可见控件 309
15.10小结 310
第16章 对话框 311
16.1对话框 311
16.2简单对话框 312
16.2.1简单单页对话框 312
16.2.2标准对话框 313
16.3复杂对话框 314
16.3.1焦点更改 314
16.3.2状态更改 315
16.4单页对话框 315
16.5多页对话框 316
16.5.1UIQ变形 316
16.5.2S60变形 318
16.6对话框API 321
16.6.1资源规范 321
16.6.2框架函数 322
16.7对话框的常用控件 324
16.8对话框中的定制控件 325
16.9小结 327
第17章 图形显示 328
17.1绘图基础 328
17.1.1控件 329
17.1.2获取图形上下文 329
17.1.3绘制矩形 330
17.1.4绘制文本 330
17.1.5垂直对齐 331
17.2CGraphicsContextAPI 331
17.2.1坐标类 332
17.2.2区域相关类 332
17.2.3设置图形上下文 333
17.2.4绘制函数 333
17.3绘制和重绘 335
17.3.1模型、视图和控制器模式 336
17.3.2Draw()约定 337
17.4绘制控件 339
17.4.1绘制到视图的一部分 339
17.4.2DrawNow()模式 341
17.5屏幕共享 342
17.5.1CONE 342
17.5.2拥有窗口和寄宿控件 343
17.5.3复合控件 345
17.5.4绘制的更多知识 346
17.6CCoeControl的绘制支持 350
17.6.1控件环境 350
17.6.2拥有窗口和寄宿控件 351
17.6.3组件控件 352
17.6.4控件位置与大小 352
17.6.5绘制函数 353
17.7特殊效果 354
17.7.1动画 354
17.7.2Uikon调试键 355
17.7.3控件上下文 356
17.7.4滚动 356
17.7.5透明窗口 357
17.8窗口服务器功能 357
17.8.1无闪烁重绘 357
17.8.2重绘存储 358
17.9与设备和尺寸无关的图形 359
17.9.1开发人员对于设备无关代码的探索 360
17.9.2应用程序中与尺寸和目标无关的绘制 360
17.9.3与设备无关的绘制 362
17.9.4深入介绍GDI 370
17.10小结 376
第18章 图形交互 378
18.1按键、触笔和命令的基础知识 378
18.2对于交互的用户需求 379
18.3一些基本抽象 380
18.3.1程序员需求 380
18.3.2复合控件 381
18.3.3键分布和焦点 381
18.3.4变灰和可见性 381
18.3.5验证 382
18.3.6控件观察器 382
18.3.7容器 384
18.4处理键事件 384
18.4.1控件栈 385
18.4.2焦点 386
18.4.3文本光标 387
18.5处理触笔事件 387
18.5.1交互范例 387
18.5.2选取相关性 387
18.5.3抓取触笔按下控件 388
18.5.4捕获触笔 388
18.5.5获得高分辨率的触笔事件 388
18.5.6如何处理触笔事件 389
18.6窗口服务器和控件环境API的更多知识 390
18.6.1应用程序与窗口服务器的通信 390
18.6.2窗口类型 391
18.7小结 393
第19章 插件和扩展性 395
19.1系统服务 395
19.1.1通信和消息服务 395
19.1.2多媒体服务 395
19.1.3RDBMS 396
19.1.4任务调度器 396
19.1.5EZLIB 396
19.1.6XML框架 396
19.1.7系统服务的更多参考 397
19.2什么是插件 397
19.2.1即时消息发送客户端应用程序如何工作 398
19.2.2多态性 398
19.2.3打包二进制 399
19.2.4加载多态DLL 400
19.2.5管理插件DLL 401
19.3ECOM库 402
19.3.1使用ECOM插件 402
19.3.2设计插件接口类 403
19.3.3编写ECOM插件 403
19.3.4集成到一起 406
19.3.5REComSession∷FinalClose() 407
19.3.6ECOM的使用 408
19.3.7参考文献 408
19.4Symbian操作系统中的插件 408
19.4.1消息MTM 408
19.4.2通信扩展模块 408
19.4.3ETel扩展模块 409
19.4.4ESOCK协议模块 409
19.5小结 409
第20章 通信和消息发送服务 410
20.1连三子游戏中的通信 410
20.2控制器和传输间的通信 411
20.3串口通信 413
20.3.1打开串口连接 414
20.3.2通过串口连接交换数据 415
20.3.3红外上的串口通信 416
20.3.4蓝牙上的串口通信 417
20.4基于套接字的通信 417
20.4.1套接字服务器 418
20.4.2基于套接字的红外连接 418
20.4.3基于套接字的蓝牙连接 420
20.4.4使用蓝牙连接两个手机 421
20.5消息发送 429
20.5.1消息服务器 429
20.5.2消息树 430
20.5.3使用SendAs服务器发送消息 430
20.5.4接收消息 431
20.5.5email 432
20.5.6短消息服务(SMS) 433
20.5.7多媒体消息服务(MMS) 434
20.6安全性 438
20.6.1数据验证 439
20.6.2平台安全 440
20.7小结 440
第21章 多媒体服务 441
21.1多媒体框架 441
21.1.1对媒体格式的支持 442
21.1.2API概述 442
21.1.3音频剪辑播放 445
21.1.4通知音频资源的可用性 447
21.1.5音频剪辑录制 448
21.1.6音频流化 452
21.1.7音调播放 455
21.1.8视频播放 456
21.1.9视频录制 457
21.1.10使用DevSound 458
21.1.11编写控制器插件 460
21.2图像转换库 462
21.2.1API概述 462
21.2.2图像解码 463
21.2.3图像编码 467
21.2.4图像变换 472
21.3照相机API 472
21.3.1选择相机 473
21.3.2配置照相机 473
21.3.3显示取景器 474
21.3.4捕获静态图像 475
21.4调谐器API 477
21.4.1调谐 477
21.4.2调谐器音频播放 480
21.4.3调谐器音频录制 480
21.4.4使用RDS数据 481
21.5小结 482
第22章 SQLRDBMS介绍 483
22.1RDBMS概述 483
22.2SQL基础 484
22.2.1基本SQL术语 484
22.2.2更多的SQL功能 485
22.2.3使用多数据库 486
22.2.4存储过程、事件和触发器 487
22.2.5SQL语法 488
22.3SymbianSQL服务器组件架构 492
22.3.1客户端API 493
22.3.2从语句中返回数据库 500
22.3.3平台安全 506
22.4Symbian操作系统错误码 508
22.5小结 509
附录A开发人员资源 510
术语表 514
参考文献 516