連載
» 2008年03月07日 00時00分 公開

GUIアプリ開発で必ず覚えてほしいポイントSymbian OSアプリ開発の手引き(2)(1/3 ページ)

今回はGUI版HelloWorldの開発を行う。そこできちんと理解しておきたいのが“UIからの指示を受けて内部処理に展開する部分”だ

[大久保 潤 管理工学研究所,@IT MONOist]

 S60のSDKと統合開発環境Carbide.c++を使って実際のSymbian OSのプログラミングを体験しようというこの連載、前回「Carbide.c++ではじめるSymbianプログラミング」では環境の構築からお約束のHelloWorldの出力までを達成しました。そこで今回はその先に進んで、前回のソースの解説とGUI版のHelloWorldアプリケーションの作成を行います。

 本編に入る前に、前回の記事について1点補足しておかなければならないことがあります。今回の対象環境として選んだのはS60の3rd Ed FP2 Beta(正式名称はRelease Note for S60 3rd Edition SDK for Symbian OS, supporting Feature Pack 2, for C++, Betaです。以下、FP2、または単にSDKと略記します)というSDKでした。これは最新のSDKであり、いまSymbian OSの学習を始めるにはベストの選択といえます。実は連載第1回を書いている最中にはFP2の搭載機種はまだ発表されていなかったのですが、この1カ月の間に、

の4機種がリリースされました。現在、まだBetaの文字が付いていおりますが、早晩正式版がアナウンスされると思います。実際の製品とSDKのバージョンの詳細はhttp://www.forum.nokia.com/devices/matrix_all_1.htmlで確認することができます。興味がある方はご覧ください。

注:以降の解説は連載第1回「Carbide.c++ではじめるSymbianプログラミング」で準備した環境を基に進めています。

 

キャラクタ版HelloWorldのポイント

 ではCarbide.c++が生成したHelloWorldの解析をはじめましょう。プログラムの実行が開始されたとき、最初に制御が渡ってくるエントリポイントは以下のようになっています(全体像は前回の記事、またはお手元のCarbide.c++で実際のソースコードを見てください)。

リスト1 エントリポイント(スタートアップ処理) (画像をクリックすると拡大します)

 エントリポイントであるGLDEF_C TInt E32Main()で特徴的なところはリスト12)3)の部分です。2)ではクリーンナップスタックを作り、3)ではそれを使って例外処理をトラップしています。WindowsやLinuxなどの通常の環境では、このあたりはランタイムに隠れているのですが、Symbian OSでは陽に設定させているわけですね。キャラクタベースの入出力を行うConsoleの生成もここで行っていますから、まさにランタイムのスタートアップコードがさらされている状態です。これには理由も利点もあります。

 まず理由ですが、Symbian OSがデザインされたとき、C++の構造化例外処理はまだ正式仕様が定まっていませんでした。だからSymbian OSでは独自の例外処理機構を採用し現在に至っています。その初期設定に対応するものがクリーンナップスタックの生成です。そして、利点はスタートアップ相当に手を入れようと思ったときに、それが可能であるということです。見たくないから隠してよ、別に気にしたくないし、という声も聞こえてきそうですが、その場合はIDEに頼りましょう。プロジェクトを新規作成するとき、決まりもの(ボイラープレート)のコードはIDEが目的に合わせて生成してくれますし、見たくない関数は表示を折りたたむこと(フォールディング)ができます。面倒なことはIDEにやらせておけ、という流れがSymbian OSにおいても一般化しつつあるのです。

 第2レベルの関数、DoStartL()で行っている処理も、エントリポイントと同様の決まりもののスタートアップ処理です。Symbian OSでは非同期処理を頻繁に使用するので、そのために使うCActiveSchedulerというクラスのインスタンスをここでは用意しています。今回使うか、使わないかは別にして、この種類のプログラムに必要と思われるものは一式準備しておこうということです。

LOCAL_C void DoStartL()
    {
    // アクティブスケジューラの作成
    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
    // 例外発生時にリークしないよう、クリーンナップスタックに積んでおく
    CleanupStack::PushL(scheduler);
    CActiveScheduler::Install(scheduler);
    // 中核処理
    MainL();

    // 処理が完了したので、クリーンナップスタック経由で資源を解放
    CleanupStack::PopAndDestroy(scheduler);
    }
リスト2 アクティブスケジューラの準備(スタートアップ処理)

 ただしリスト2のように、エントリポイントとは別にDoStartL()という関数を作って、その中でアクティブスケジューラを用意する2層構造がマストなわけではありません。これはCarbide.c++がボイラープレートを用意するに当たって決めた方針と理解してください。要は必要な初期化処理をIDEに作ってもらって、必要な部分だけをプログラマが記述できるようになっていればよいのです。では、そのプログラマが任意のコードを記述する部分をリスト3に示します。

リスト3 エントリポイント

 この関数だけを見ると、WindowsやLinuxの世界でのHelloWorldとあまり違いがありませんね。つまりスタートアップコードがボイラープレートとして見えてしまうか否か、その点を除けば普通のHelloWorldができる環境だということがいえます。コードをフォールディングすると、普通のHelloWorldに見えることを画面1に示します。

画面1 フォールディングされたHelloWorld

 ちなみにこのボイラープレートでは、

console->Printf(KTextPressAnyKey);
console->Getch();                   // キー入力待ち

がエントリポイントに入れられていますが、別にMainL()で実行することに何の不都合もありません。処理を追加して、ビルド、実行と試してみましょう。

 ところでこのコンソールアプリ、Symbian OSではテストハーネスという用途にも使われます。標準語でいうとテストユニットですね。カバレージを担保したテストを行う際にはテストユニットを作るというのがすでに常識となっていますが、Symbian OSでもこのためのクラスRTest(注)が用意されています(ただし微妙に整合性がないところがあるので、標準的なテストユニットにうまく収斂(しゅうれん)していってほしいものです)。GUIものの携帯電話開発環境で、何でキャラクタベースの環境がと思われたかもしれませんが、いろいろ理由があるのです(ほかにも使い道があるのですが、それは連載後半で)。次はGUI版HelloWorldの作成について解説します。

注:前回導入したS60のSDKにDocBrowserという、その名のとおりSDKに収められている技術資料をブラウズするためのプログラムがあります。これでRTestを探してみてください。ボイラープレートが生成するコードに含まれているクラスはすべてこのDocBrowserで調べることができます。またこのプログラム自体もEclipseの上に構築されています。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.