2006年02月01日

Symbian OS C++ 実践開発技法

第1章 Symbian OSにおけるクラス名の規約

1.1 基本型
1.2 Tクラス
1.3 Cクラス
1.4 Rクラス
1.5 Mクラス
1.6 静的クラス
1.7 ご注意ください
1.8 まとめ

第2章 リーブ:Symbian OSの例外

2.1 リーブする関数
2.2 new(ELeave)を使うヒープ割り当て
2.3 コンストラクタとデストラクタ
2.4 リーブする関数の扱い方
2.5 TRAPとTRAPDを使ってリーブをトラップする
2.6 LeaveScan
2.7 まとめ

第3章 クリーンアップスタック

3.1 クリーンアップスタックを使う
3.2 クリーンアップスタックの仕組み
3.3 非CBaseクラスでクリーンアップスタックを使う
3.4 カスタマイズしたクリーンアップのためにTCleanupItemを使う
3.5 可搬性
3.6 キャストの使用に関する注意事項
3.7 まとめ

第4章 2フェーズコンストラクション

4.1 まとめ

第5章 ディスクリプタ:Symbian OSの文字列

5.1 書き換え不可能なディスクリプタ
5.2 書き換え可能なディスクリプタ
5.3 ポインタディスクリプタ
5.4 スタック上のバッファディスクリプタ
5.5 ヒープ上のバッファディスクリプタ
5.6 リテラルディスクリプタ
5.7 まとめ

第6章 ディスクリプタの正しい使い方

6.1 パラメータや戻り値の型としてのディスクリプタ
6.2 ディスクリプタの共通メソッド
6.3 ヒープディスクリプタHBufCの使い方
6.4 ディスクリプタの外部化と内部化
6.5 TFileNameの使いすぎ
6.6 ディスクリプタの操作に便利なクラス
6.7 まとめ

第7章 動的な配列をバッファ

7.1 CArrayXクラス
7.2 RArrayとRPointerArray
7.3 CArrayXではなくRArrayを使う理由
7.4 動的ディスクリプタ配列
7.5 固定長配列
7.6 動的バッファ
7.7 まとめ

第8章 アクティブオブジェクトによるイベント駆動のマルチタスク

8.1 マルチタスクの基礎
8.2 イベント駆動のマルチタスク
8.3 アクティブオブジェクトの扱い方
8.4 サンプルコード
8.5 アクティブスケジューラを持たないスレッド
8.6 アプリケーションコードとアクティブオブジェクト
8.7 まとめ

第9章 アクティブオブジェクトの実際

9.1 アクティブオブジェクトの基本
9.2 アクティブオブジェクトの役割分担
9.3 非同期サービスプロバイダの役割分担
9.4 アクティブスケジューラの役割分担
9.5 アクティブスケジューラの起動
9.6 アクティブスケジューラのネスト
9.7 アクティブスケジューラの拡張
9.8 キャンセル
9.9 要求の完了
9.10 ステートマシン
9.11 長期タスク
9.12 CIdleクラス
9.13 CPeriodicクラス
9.14 よくある間違い
9.15 まとめ

第10章 Symbian OSのスレッドとプロセス

10.1 RThreadクラス
10.2 スレッドの優先順位
10.3 実行中のスレッドを停止させる
10.4 スレッド間のデータ転送
10.5 例外処理
10.6 プロセス
10.7 まとめ

第11章 クライアント/サーバフレームワークの理論

11.1 なぜクライアント/サーバーフレームワークを持たせるのか?
11.2 クライアントとサーバは、どのように連携するのか?
11.3 クライアントとサーバは、どのように通信するのか?
11.4 クライアント/サーバフレームワークで使われるクラスは?
11.5 同期要求と非同期要求の違いは?
11.6 サーバに起動方法は?
11.7 1つのクライアントは何個の接続を持てるのか?
11.8 クライアントが接続を断つとどうなるのか?
11.9 クライアントが死ぬとどうなるのか?
11.10 サーバが死ぬとどうなるのか?
11.11 クライアント/サーバ通信はスレッドをどう使うか?
11.12 サーバがわにアクティブオブジェクトがある意味は?
11.13 ローカル(同一プロセス)サーバの利点は?
11.14 クライアント/サーバ通信のオーバーヘッドには何があるのか?
11.15 クライアントがサーバに出せる未解決要求は何個までか?
11.16 サーバ機能は拡張できるのか?
11.17 サンプルコード
11.18 まとめ

第12章 クライアント/サーバフレームワークの実践

12.1 クライアント/サーバの要求コード
12.2 クライアントのボイラープレートコード
12.3 サーバを起動し、クライアントからそれに接続する
12.4 サーバのスタートアップコード
12.5 サーバクラス
12.6 サーバのシャットダウン
12.7 サーバをアクセスする
12.8 まとめ

第13章 各種バイナリファイル

13.1 Symbian OSのEXE
13.2 Symbian OSのDLL
13.3 書き換え可能な静的データ
13.4 TLS(スレッドローカル記憶域)
13.5 DLLローダ
13.6 UID
13.7 targettype指定子
13.8 まとめ

第14章 ECOM

14.1 ECOMアーキテクチャ
14.2 ECOMインターフェイスの特徴
14.3 ファクトリメソッド
14.4 ECOMインターフェイスを実装する
14.5 リソースファイル
14.6 クライアントコードのサンプル
14.7 まとめ

第15章 パニック

15.1 「ジャストインタイム」デバッグ
15.2 正しいパニックの形式
15.3 Symbian OSにおけるパニックの分類
15.4 別スレッドにパニックを発生させる
15.5 フォールトとリーブとパニック
15.6 まとめ

第16章 アサートを使ってバグを検出する

16.1 __ASSERT_DEBUG
16.2 __ASSERT_ALWAYS
16.3 まとめ

第17章 デバッグマクロとテストクラス

17.1 ヒープチェック用マクロ
17.2 オブジェクト不変マクロ
17.3 RTestを使ったコンソールテスト
17.4 まとめ

第18章 互換性

18.1 前方互換性と後方互換性
18.2 ソース互換性
18.3 バイナリ互換性
18.4 互換性を守る方法
18.5 バイナリ互換性を守りながら何を変更できるのか?
18.6 最良の策は、将来の変更に備えること
18.7 互換性とSymbian OSのクラス型
18.8 まとめ

第19章 薄いテンプレート

19.1 まとめ

第20章 包括的で分かりやすいAPIを公開しよう

20.1 クラスのレイアウト
20.2 IMPORT_CとEXPORT_C
20.3 パラメータと戻り値
20.4 メンバデータと「関数による抽象化」
20.5 クラス名、メソッド名、パラメータ名の選択
20.6 コンパイラが生成する関数
20.7 まとめ

第21章 正しいコーディングスタイル

21.1 プログラムコードのサイズを削減する
21.2 ヒープメモリを注意して使う
21.3 スタックメモリを注意して使う
21.4 コードの効率を最大化するために共通部分式を削除する
21.5 最適化は最後の手段
21.6 まとめ

付録

コードチェックリスト
クラスの宣言
ヘッダファイル
コメント
コンストラクタ
デストラクタ
割り当てと削除
クリーンアップスタックとリーブ安全性
ループとプログラムのフロー制御
プログラムのロジック
ディスクリプタ
コンテナ

用語集

参考文献とオンラインリソース
Symbian OSに関する書籍
C++に関する書籍
インターネット上のSymbian OSリソース
posted by シンビアン at 21:55| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

Symbian Os Explained : Effective C++ Programming for Smartphones

# Mobile communication systems
# Computer programs
# Operating systems (Computers)
# C++ (Computer program language

Textual Format :Computer Applications
Academic Level :Extracurricular

Baker&Taylor

Table of Contents

Foreword xi
About This Book xiii
Who Is It For? xiv
How to Use This Book xiv
Notation and Code Conventions Used in This Book xv
Introduction to Symbian OS xvii
Author Biography xxi
Author's Acknowledgments xxiii
Symbian Press Acknowledgments xxv
Class Name Conventions on Symbian OS 1 (12)
Fundamental Types 1 (2)
T Classes 3 (1)
C Classes 4 (2)
R Classes 6 (1)
M Classes 7 (4)
Static Classes 11 (1)
Buyer Beware 11 (1)
Summary 12 (1)
Leaves: Symbian OS Exceptions 13 (16)
Leaving Functions 13 (3)
Heap Allocation Using new (ELeave) 16 (1)
Constructors and Destructors 17 (1)
Working with Leaving Functions 18 (2)
Trapping a Leave Using Trap and Trapd 20 (6)
LeaveScan 26 (1)
Summary 27 (2)
The Cleanup Stack 29 (20)
Using the Cleanup Stack 31 (4)
How Does the Cleanup Stack Work? 35 (3)
Using the Cleanup Stack with Non-CBase 38 (6)
Classes
Using TCleanupItem for Customized Cleanup 44 (2)
Portability 46 (1)
An Incidental Note on the Use of Casts 46 (1)
Summary 47 (2)
Two-Phase Construction 49 (6)
Descriptors: Symbian OS Strings 55 (20)
Non-Modifiable Descriptors 56 (2)
Modifiable Descriptors 58 (2)
Pointer Descriptors 60 (3)
Stack-Based Buffer Descriptors 63 (2)
Heap-Based Buffer Descriptors 65 (4)
Literal Descriptors 69 (3)
Summary 72 (3)
Good Descriptor Style 75 (16)
Descriptors as Parameters and Return Types 75 (3)
Common Descriptor Methods 78 (4)
The Use of HBufC Heap Descriptors 82 (2)
Externalizing and Internalizing 84 (2)
Descriptors
The Overuse of TFileName 86 (1)
Useful Classes for Descriptor Manipulation 87 (1)
Summary 88 (3)
Dynamic Arrays and Buffers 91 (20)
CArrayX Classes 92 (5)
RArray and 97 (5)
RPointerArray
Why Use RArray Instead of CArrayX? 102 (1)
Dynamic Descriptor Arrays 103 (1)
Fixed-Length Arrays 104 (2)
Dynamic Buffers 106 (3)
Summary 109 (2)
Event-Driven Multitasking Using Active 111 (16)
Objects
Multitasking Basics 111 (1)
Event-Driven Multitasking 112 (3)
Working with Active Objects 115 (5)
Example Code 120 (3)
Threads Without an Active Scheduler 123 (1)
Application Code and Active Objects 123 (1)
Summary 124 (3)
Active Objects under the Hood 127 (24)
Active Object Basics 128 (3)
Responsibilities of an Active Object 131 (2)
Responsibilities of an Asynchronous 133 (1)
Service Provider
Responsibilities of the Active Scheduler 134 (1)
Starting the Active Scheduler 135 (1)
Nesting the Active Scheduler 135 (1)
Extending the Active Scheduler 136 (1)
Cancellation 137 (1)
Request Completion 138 (1)
State Machines 138 (5)
Long-Running Tasks 143 (3)
Class CIdle 146 (2)
Class CPeriodic 148 (1)
Common Mistakes 149 (1)
Summary 150 (1)
Symbian OS Threads and Processes 151 (16)
Class RThread 152 (3)
Thread Priorities 155 (2)
Stopping a Running Thread 157 (5)
Inter-Thread Data Transfer 162 (1)
Exception Handling 163 (1)
Processes 164 (2)
Summary 166 (1)
The Client--Server Framework in Theory 167 (22)
Why Have a Client--Server Framework? 168 (1)
How Do the Client and Server Fit Together? 168 (2)
How Do the Client and Server Communicate? 170 (1)
What Classes Does the Client--Server 170 (9)
Framework Use?
How Do Synchronous and Asynchronous 179 (1)
Requests Differ?
How Is a Server Started? 179 (1)
How Many Connections Can a Client Have? 180 (1)
What Happens When a Client Disconnects? 180 (1)
What Happens If a Client Dies? 181 (1)
What Happens If a Server Dies? 181 (1)
How Does Client--Server Communication Use 181 (1)
Threads?
What Are the Implications of Server-Side 182 (1)
Active Objects?
What Are the Advantages of a Local 182 (1)
(Same-Process) Server?
What Are the Overheads of Client--Server 183 (3)
Communication?
How Many Outstanding Requests Can a 186 (1)
Client Make to a Server?
Can Server Functionality Be Extended? 186 (1)
Example Code 186 (1)
Summary 187 (2)
The Client--Server Framework in Practice 189 (28)
Client--Server Request Codes 190 (1)
Client Boilerplate Code 191 (7)
Starting the Server and Connecting to It 198 (5)
from the Client
Server Startup Code 203 (2)
Server Classes 205 (8)
Server Shutdown 213 (1)
Accessing the Server 214 (1)
Summary 214 (3)
Binary Types 217 (16)
Symbian OS EXEs 217 (1)
Symbian OS DLLs 218 (2)
Writable Static Data 220 (3)
Thread-Local Storage 223 (3)
The DLL Loader 226 (1)
UIDs 226 (2)
The targettype Specifier 228 (2)
Summary 230 (3)
ECOM 233 (14)
ECOM Architecture 233 (3)
Features of an ECOM Interface 236 (1)
Factory Methods 237 (3)
Implementing an ECOM Interface 240 (2)
Resource Files 242 (3)
Example Client Code 245 (1)
Summary 246 (1)
Panics 247 (8)
Just-In-Time Debugging 248 (1)
Good Panic Style 249 (1)
Symbian OS Panic Categories 250 (1)
Panicking Another Thread 251 (2)
Faults, Leaves and Panics 253 (1)
Summary 253 (2)
Bug Detection Using Assertions 255 (10)
__Assert_Debug 256 (5)
__Assert_Always 261 (2)
Summary 263 (2)
Debug Macros and Test Classes 265 (12)
Heap-Checking Macros 265 (5)
Object Invariance Macros 270 (3)
Console Tests Using RTest 273 (3)
Summary 276 (1)
Compatibility 277 (16)
Forward and Backward Compatibility 278 (1)
Source Compatibility 279 (1)
Binary Compatibility 280 (1)
Preventing Compatibility Breaks 281 (6)
What Can I Change Without Breaking Binary 287 (2)
Compatibility?
Best Practice: Planning for Future Changes 289 (2)
Compatibility and the Symbian OS Class 291 (1)
Types
Summary 292 (1)
Thin Templates 293 (6)
Expose a Comprehensive and Comprehensible 299 (18)
API
Class Layout 300 (1)
Import_C and Export_C 301 (2)
Parameters and Return Values 303 (6)
Member Data and Functional Abstraction 309 (3)
Choosing Class, Method and Parameter Names 312 (2)
Compiler--Generated Functions 314 (1)
Summary 315 (2)
Good Code Style 317 (16)
Reduce the Size of Program Code 317 (3)
Use Heap Memory Carefully 320 (5)
Use Stack Memory Carefully 325 (3)
Eliminate Sub-Expressions to Maximize 328 (2)
Code Efficiency
Optimize Late 330 (1)
Summary 331 (2)
Appendix Code Checklist 333 (6)
Glossary 339 (8)
Bibliography and Online Resources 347 (4)
Index 351
posted by シンビアン at 21:28| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

継承(「is a」の関係)

継承とは、あるクラスが別のクラスの「特化」であるという概念だ。継承の目的は、複数の派生(サブ)クラスの共通要素を規定する基底(スーパー)クラスを定義して、コードを単純にすることである。共通要素としては、ルーチンのインターフェイス、実装、メンバデータ、データ型などが挙げられる。継承を利用すれば、コードやデータを基底クラスで一元的に管理できるようになるので、複数の場所で定義する必要がなくなる。継承を使用する際には、次の点について決断する必要がある。

*

メンバルーチンはそれぞれ派生クラスから参照できるか。既定の実装を持つか。既定の実装はオーバーライド可能か。
*

メンバデータ(変数、名前付き定数、列挙など)はそれぞれ派生クラスから参照できるか。
posted by シンビアン at 20:50| Comment(0) | TrackBack(1) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

プライベート継承を使って「has a」を実装するのは最後の手段である

状況によっては、あるオブジェクトを別のオブジェクトのメンバにする方法では、包含を実現できないことがある。そのような場合、一部の専門家は、包含されるオブジェクトをプライベートで継承することを提案している(Meyers1998; Sutter 2000)。そうする主な理由とは、含む側のクラスを含まれる側のクラスのprotectedのメンバルーチンまたはメンバデータにアクセスさせるためである。実際には、これでは祖先のクラスとの結合度が強くなりすぎて、カプセル化に違反してしまう。たいていは、プライベート継承以外の方法で解決しなければならない設計上のミスである。
posted by シンビアン at 20:39| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

確保したヒープメモリの有効範囲

質問:

[PIMInfo->PIMAplWork]に設定したヒープはOUT中でも保持されるとの事ですが、 それ以外のポインタ(外部変数)等に確保したヒープは保持されないのでしょうか?サンプルで実験したところでは、問題なく保持されているようです。

PTR pDummy;

BOOLEAN PIMAplConstruct(PIMINFO *PIMInfo, USHORT InitLevel)
{
/* OUTワークの確保 */
if (!(pDummy = NewHeapPtr(1000)))
{
/* ヒープが確保できない場合は − 続行不可能 */
return false;
}
return true;
}

この様な方法で確保したヒープメモリが保持できない理由と、メモリの内容が破壊されるタイミングを教えて欲しい。

回答:

ヒープ領域の有効範囲については、確保した関数は関係ありません。ヒープ領域自体はアプリケーションプロセスが起動している間中、保持されます。従いまして、確保した領域へのハンドル、またはポインタを格納する変数に依存します。
PIMInfo->PIMAplWorkは、アプリケーションプロセスが起動している間中、保持されます。
PIMExecWork->PIMUserWorkは、アプリケーションがアクティブな間中、保持されます。アプリケーションがOUT状態になった時点で値は保証されなくなります(通常はOUT状態に移行する前にユーザが解放する必要がありますが、仮に解放しなくても値は保証されません)。
AplForm->UserWorkはフォームが表示されている間中、保持されます。他のフォームに切り替わった時点で値は保証されなくなります(通常はフォームが切り替わる前にユーザが解放する必要がありますが、仮に解放しなくても値は保証されません)。
その他の、例えばお客様がご指摘されているような外部変数についてはC言語の仕様に準じます。つまり外部変数の場合は、アプリケーションプロセスが起動している間中、保持されます。
posted by シンビアン at 20:12| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

ヒープメモリについて

1)PIMクラスメソッドにおいて確保したヒープメモリの有効範囲
PIMAplSetupにおいてNewHeapPtrで確保したヒープメモリは、アプリケーション上でいつでも使用する事が可能か? 一度OUT状態になっても再びEXEC状態に戻れば、ヒープメモリが開放されたりメモリの内容が破壊されたりする事は無いと考えて良いか?

(2)この様にアプリケーションが常時使用するヒープメモリは、PIMAplConstructとPIMAplSetupのどちらで確保した方が良いのか?

(3)PIMクラスメソッドにおいて確保したヒープメモリの開放処理
 PIMAplConstruct又はPIMAplSetupで確保したヒープメモリを開放する場合は、PIMAplEndで行う必要があるか? それともOSに任せて、開放処理を行わない方が良いのか?

回答:

(1)OUT中でも保持されています。
ここでいうOUT中も保持されるヒープとは[PIMInfo->PIMAplWork]に設定したヒープです。

(2)どちらでも結構ですが、プログラミングガイド第8章のサンプルでは、PIMAplConstruct関数で確保しています。

(3)これらの関数内で確保すべき、OUT中も保持されるヒープの解放は、アプリ終了時にシステムが行います。ユーザーが解放する必要はありません。なお、ここでいうOUT中も保持されるヒープとは[PIMInfo->PIMAplWork]に設定したヒープです。


アプリケーションで使用する上記のようなヒープは、大まかに3種類あります。下記以外にも局所的に使用するワークとしてのヒープもあります。

・OUT中も内容が保持されるヒープ
 PIMAplConstruct または PIMAplSetUp関数で[PIMInfo->PIMAplWork]に設定したヒープです。主にレジュームするための情報を保持しておきます。ユーザーが解放処理をする必要はありません。

・EXEC中に保持されているヒープ(OUT中は不明)
 PIMExecConstruct または PIMExecSetUp関数で[PIMExecWork->PIMUserWork]に設定したヒープです。主に複数のフォーム間で共有する情報を保持しておきます。ユーザーがPIMExecEnd関数で解放処理を行います。

・フォーム実行中に保持されているヒープ(フォーム終了後は不明)
 FormConstruct または FormSetUp関数で[AplForm->UserWork]に設定したヒープです。主にフォーム実行中に参照したい内容を保持しておきます。ユーザーがFormEnd関数で解放処理を行います。
posted by シンビアン at 20:11| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

ヒープメモリ

Microsoft IEで不正なCSSタグを解析するとヒープメモリがクラッシュする脆弱性が見つかる
サイバーディフェンス社からの情報によると、マイクロソフト社のInternet Explorerの複数のバージョンで、リモートから攻撃可能なバッファオーバーフローが見つかった。これにより、ローカルユーザの権限で任意のコードが実行される可能性がある。この問題は、CSS(Cascading Style-Sheets)を処理する際の不正なバッファが原因で発生する。@;/*というCSSスタイルタグを含んだ不正なwebページを表示させられると、脆弱なバージョンのIEがクラッシュする可能性がある。この脆弱性により、任意のコードが実行される可能性がある。
posted by シンビアン at 20:10| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。