內容簡介
本書深入介紹了Symbian作業系統C++手機開發的各方面知識,吸收了Symbian公司工程師的豐富經驗,為使用Symbian作業系統v9.0及其以上版本的手機編寫C++應用程式提供了完整的基礎知識體系。本書在前兩卷的基礎上,對Symbian作業系統v8.0以上版本的新特性進行了己抹微有效的補充,並全面介紹了平台安全和應用程式發布、外掛程式和可擴展性以及Symbian作業系統上的資料庫管理等方面的知識。
對於從事與Symbian作業系統相關工作的讀者來說,本書將引導你成為一名高效的Symbian作業系統的開發者,並且讓你對Symbian作業系統的基本原則有深刻的理解。對於期待使用Symbian技術開發移動解決方案的程式設計師或者管理人員,以及考慮使用Symbian作業系統技術從事相關活動的諮詢師和培訓師,本書也是一本寶貴的參考書。
圖書目錄
第 1章 起步 1
1.1 使用仿真器 1
1.1.1 啟動仿真器 1
1.1.2 GUI樣式 2
1.2 Hello World之文本版本 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.1 Symbian作業系統基礎 12
2.1.1 關於核心 13
2.1.2 執行緒和進程模型 16
2.1.3 用戶記憶體及記憶體管理 17
2.1.4 Symbian作業系統伺服器 17
2.1.5 Symbian作業系統進程間通信 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.1 Symbian作業系統罪慨蜜C++ 21
2.2.2 並發和活動對象 21
2.2.3 Symbian作業系統C++異常處理 拜虹簽24
2.2.4 Symbian作業系統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)、分行(Line Breaks)和括弧(Bracketing) 31
3.3 函式 33
3.4 API 34
3.4.1 函式類型 35
3.4.2 DLL和其他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.2 Symbian作業系統中的類的分類 45
4.2.1 T類和C類 45
4.2.2 R類 46
4.2.3 M類 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.4 CBase和清理棧 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.1 TPtrC描述符 65
5.5.2 類型2 TPtr 描述符 65
5.5.3 類型4 TPtr描述符 66
5.5.4 使用TPtr::Set() 66
5.6 堆描述符 67
5.6.1 HBuf描述符 67
5.6.2 RBuf描述符 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.7 TDesC函式 97
5.12.8 TDes函式 97
5.12.9 HBufC函式 99
5.12.10 RBuf函式 99
5.12.11 TBuf函式 100
5.12.12 TBufC函式 100
5.12.13 TPtr函式 100
5.12.14 TPtrC函式 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 “Set hello”選單項 107
6.3.2 “Start flashing”選單項 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.7 RFileBuf 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.5 Symbian簽名概述 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.1 Carbide.c++ IDE 194
10.2.2 CodeWarrior IDE 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 使用D_EXC工具 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.1 Symbian 作業系統應用程式框架 208
11.2 S60和UIQ平台應用程式框架 209
11.3 圖形化的“Hello World!”程式 210
11.3.1 類結構 210
11.3.2 產生示例代碼 211
11.3.3 項目描述檔案 211
11.3.4 應用程式入口 213
11.3.5 Application類 213
11.3.6 Document類 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.2 UIQ 3的不同 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.1 STRUCT語句 249
13.2.2 RESOURCE語句 250
13.2.3 ENUM語句 251
13.2.4 NAME語句 251
13.3 點陣圖和圖示 251
13.3.1 轉換點陣圖 253
13.3.2 bmconv工具 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.1 UIQ視圖 265
14.1.2 S60視圖 266
14.1.3 移植性 266
14.1.4 應用程式UI的角色 266
14.1.5 默認視圖 267
14.1.6 觀察器 268
14.2 MCoeView接口 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.1 UIQ變形 316
16.5.2 S60變形 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.2 CGraphicsContext API 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.2 Draw()約定 337
17.4 繪製控制項 339
17.4.1 繪製到視圖的一部分 339
17.4.2 DrawNow()模式 341
17.5 螢幕共享 342
17.5.1 CONE 342
17.5.2 擁有視窗和寄宿控制項 343
17.5.3 複合控制項 345
17.5.4 繪製的更多知識 346
17.6 CCoeControl的繪製支持 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.2 Uikon調試鍵 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.3 RDBMS 396
19.1.4 任務調度器 396
19.1.5 EZLIB 396
19.1.6 XML框架 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.3 ECOM庫 402
19.3.1 使用ECOM外掛程式 402
19.3.2 設計外掛程式接口類 403
19.3.3 編寫ECOM外掛程式 403
19.3.4 集成到一起 406
19.3.5 REComSession::FinalClose() 407
19.3.6 ECOM的使用 408
19.3.7 參考文獻 408
19.4 Symbian作業系統中的外掛程式 408
19.4.1 訊息MTM 408
19.4.2 通信擴展模組 408
19.4.3 ETel擴展模組 409
19.4.4 ESOCK協定模組 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 使用Send As伺服器傳送訊息 430
20.5.4 接收訊息 431
20.5.5 email 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.2 API概述 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.1 API概述 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章 SQL RDBMS介紹 483
22.1 RDBMS概述 483
22.2 SQL基礎 484
22.2.1 基本SQL術語 484
22.2.2 更多的SQL功能 485
22.2.3 使用多資料庫 486
22.2.4 存儲過程、事件和觸發器 487
22.2.5 SQL語法 488
22.3 Symbian SQL伺服器組件架構 492
22.3.1 客戶端API 493
22.3.2 從語句中返回資料庫 500
22.3.3 平台安全 506
22.4 Symbian作業系統錯誤碼 508
22.5 小結 509
附錄A 開發人員資源 510
術語表 514
參考文獻 516
3.3 函式 33
3.4 API 34
3.4.1 函式類型 35
3.4.2 DLL和其他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.2 Symbian作業系統中的類的分類 45
4.2.1 T類和C類 45
4.2.2 R類 46
4.2.3 M類 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.4 CBase和清理棧 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.1 TPtrC描述符 65
5.5.2 類型2 TPtr 描述符 65
5.5.3 類型4 TPtr描述符 66
5.5.4 使用TPtr::Set() 66
5.6 堆描述符 67
5.6.1 HBuf描述符 67
5.6.2 RBuf描述符 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.7 TDesC函式 97
5.12.8 TDes函式 97
5.12.9 HBufC函式 99
5.12.10 RBuf函式 99
5.12.11 TBuf函式 100
5.12.12 TBufC函式 100
5.12.13 TPtr函式 100
5.12.14 TPtrC函式 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 “Set hello”選單項 107
6.3.2 “Start flashing”選單項 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.7 RFileBuf 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.5 Symbian簽名概述 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.1 Carbide.c++ IDE 194
10.2.2 CodeWarrior IDE 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 使用D_EXC工具 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.1 Symbian 作業系統應用程式框架 208
11.2 S60和UIQ平台應用程式框架 209
11.3 圖形化的“Hello World!”程式 210
11.3.1 類結構 210
11.3.2 產生示例代碼 211
11.3.3 項目描述檔案 211
11.3.4 應用程式入口 213
11.3.5 Application類 213
11.3.6 Document類 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.2 UIQ 3的不同 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.1 STRUCT語句 249
13.2.2 RESOURCE語句 250
13.2.3 ENUM語句 251
13.2.4 NAME語句 251
13.3 點陣圖和圖示 251
13.3.1 轉換點陣圖 253
13.3.2 bmconv工具 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.1 UIQ視圖 265
14.1.2 S60視圖 266
14.1.3 移植性 266
14.1.4 應用程式UI的角色 266
14.1.5 默認視圖 267
14.1.6 觀察器 268
14.2 MCoeView接口 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.1 UIQ變形 316
16.5.2 S60變形 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.2 CGraphicsContext API 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.2 Draw()約定 337
17.4 繪製控制項 339
17.4.1 繪製到視圖的一部分 339
17.4.2 DrawNow()模式 341
17.5 螢幕共享 342
17.5.1 CONE 342
17.5.2 擁有視窗和寄宿控制項 343
17.5.3 複合控制項 345
17.5.4 繪製的更多知識 346
17.6 CCoeControl的繪製支持 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.2 Uikon調試鍵 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.3 RDBMS 396
19.1.4 任務調度器 396
19.1.5 EZLIB 396
19.1.6 XML框架 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.3 ECOM庫 402
19.3.1 使用ECOM外掛程式 402
19.3.2 設計外掛程式接口類 403
19.3.3 編寫ECOM外掛程式 403
19.3.4 集成到一起 406
19.3.5 REComSession::FinalClose() 407
19.3.6 ECOM的使用 408
19.3.7 參考文獻 408
19.4 Symbian作業系統中的外掛程式 408
19.4.1 訊息MTM 408
19.4.2 通信擴展模組 408
19.4.3 ETel擴展模組 409
19.4.4 ESOCK協定模組 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 使用Send As伺服器傳送訊息 430
20.5.4 接收訊息 431
20.5.5 email 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.2 API概述 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.1 API概述 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章 SQL RDBMS介紹 483
22.1 RDBMS概述 483
22.2 SQL基礎 484
22.2.1 基本SQL術語 484
22.2.2 更多的SQL功能 485
22.2.3 使用多資料庫 486
22.2.4 存儲過程、事件和觸發器 487
22.2.5 SQL語法 488
22.3 Symbian SQL伺服器組件架構 492
22.3.1 客戶端API 493
22.3.2 從語句中返回資料庫 500
22.3.3 平台安全 506
22.4 Symbian作業系統錯誤碼 508
22.5 小結 509
附錄A 開發人員資源 510
術語表 514
參考文獻 516