"HelloWorld" プログラムを作ろう ( BREW 3.1 編 ) - 2 / 3 -
BREW プロジェクトの作成
それでは BREW モジュールのプロジェクトを作成しましょう。
- Microsoft Visual Studio .NET 2003 を起動します。
- メニューの [ファイル] - [新規作成] - [プロジェクト]を選択し、[Visual C++ プロジェクト] を選択します。
- BREW SDK Tools が正しくインストールされていれば、テンプレートに [BREW Application Wizard] という項目があるはずです。これを選択します。
表示されない場合は、BREW SDK Tools を再インストールしてください。インストール時に、[Addins for VisualStudio] か [Addins for VisualStudio .NET 2003] の、自分がインストールしている方にチェックが入っていることを確認してください。
- [プロジェクト名] に "HelloWorld" と入力します。 [場所] にプロジェクトを格納するフォルダを入力します。 [OK] を押します。
- ウィザードの [ステップ 1/2] では、BREWアプリケーションで使用する機能を選択します。以下のような機能があります。
項目名 機能 File ファイル入出力機能 Network ネットワーク通信機能 Database データベース機能 TAPI/SMS 電話制御 / ショート メッセージ機能 Sound サウンド機能 これらの機能を選択すると、自動生成されるソースコードにこれらの機能を提供するAPIのヘッダーファイルがインクルードされます。あとからソースコードに手動でインクルードできるので、必ずしも今の段階で指定する必要はなく、また実際に使わない機能を選択しても特に害はありません。
今回は "Hello World" と表示するだけの単純なアプリケーションですので、いずれの機能も使用しません。何も選択せずに [Finish] ボタンを押しましょう。
- これで BREW プロジェクトが作成されました。 [環境外での変更を検出しました] との警告が出る場合は、[再読み込み] を押してください。
BREW プロジェクトの内容
BREW アプリケーション ウィザードが生成したファイルを調べてみましょう。 Visual C++ の左側の [FileView] タブを見ると、三つのファイルがプロジェクトに追加されているはずです。
- AEEAppGen.c
- AEEModGen.c
- HelloWorld.c
BREW Application Wizardで生成されたファイル
まず AEEAppGen.c と AEEModGen.c ですが、このファイルの中身を知る必要はあまりありません。また、このファイルを編集してはいけません。
AEEAppGen.c と AEEModGen.c の [プロパティ] では、完全パス が "C:\Program Files\BREW 3.1.2 Ja\sdk\src\AEEAppGen.c" のようになっており、 BREW SDK をインストールしたフォルダ内にあることが分かります。
つまり、この二つのファイルは、 BREW アプリケーション ウィザードで生成した複数の BREW プロジェクトから共有されるソースコードですので、不用意に編集してはいけないのです。
開発者が編集できるのは HelloWorld.c だけです。ここに HelloWorld アプレットの実装を記述します。 [FileView] で HelloWorld.c をダブルクリックして、このファイルを開いてみましょう。
英語で関数の説明やコメントが書いてあるのが分かります。それらのコメントを分かりやすくまとめたものを以下に示します。
// // HelloWorld.c // #include "AEEModGen.h" // 常にインクルードします #include "AEEAppGen.h" // 常にインクルードします #include "AEEShell.h" // シェル インターフェイス // 前方宣言 static boolean HelloWorld_HandleEvent( IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); // // ユーザーがアプレットを起動要求したときに、呼び出されます。 // 開発者は指定されたクラス ID の BREW アプレットを作成して返すことで、 // BREW アプレットを起動します。 // int AEEClsCreateInstance( AEECLSID ClsId, // クラス ID IShell * pIShell, // シェル インターフェイス IModule * po, // モジュール インターフェイス void ** ppObj) // 作成したアプレットを返すポインタ { *ppObj = NULL; if (ClsId == AEECLSID_HELLOWORLD) { if(AEEApplet_New(sizeof(AEEApplet), ClsId, pIShell, po, (IApplet**) ppObj, (AEEHANDLER) HelloWorld_HandleEvent, NULL)) { return AEE_SUCCESS; } } return EFAILED; } // // HelloWorld アプレットのイベント ハンドラ // static boolean HelloWorld_HandleEvent( IApplet * pi, // アプレット構造体 AEEEvent eCode, // イベントコード uint16 wParam, // イベント パラメータ (16 ビット) uint32 dwParam) // イベント パラメータ (32 ビット) { switch (eCode) { case EVT_APP_START: // ここにコードを追加します。 return TRUE; case EVT_APP_STOP: // ここにコードを追加します。 return TRUE; default: break; } return FALSE; }
BREW ウィザードが生成したコードは、 AEEClsCreateInstance() と HelloWorld_HandleEvent() という二つの関数です。
AEEClsCreateInstance() は、ユーザーが BREW アプレットのアイコンを選択して起動したときに呼び出される関数です。開発者はこの関数内で BREW アプレットのデータ構造体を作成して返す必要があります。
HelloWorld_HandleEvent() は、ユーザーが携帯電話のキーを押したり、アプリを終了させたりなど、さまざまな操作を行ったときに呼び出される関数です。
BREW アプレットの構造
BREW アプレットは、 "アプレット構造体" と "イベント ハンドラ" のペアで構成されます。
アプレット構造体とは、 BREW アプレットがデータを格納するための構造体で、そのアプレットでグローバルに使用する変数などを格納しておきます。 BREW ウィザードが生成したコードでは、デフォルトで AEEApplet 構造体が使用されています。この構造体の詳細については次回以降の連載で解説しますので、今回は説明しません。
イベント ハンドラとは、BREW 実行環境からのさまざまな通知を受け取る関数で、ユーザーがキーを押したときなどに呼び出されます。 BREW ウィザードが生成したコードでは、デフォルトで HelloWorld_HandleEvent() 関数が使用されています。
*生成されたコードでは BREW アプレットのデータ構造体として AEEApplet を使用していますが、これは (ある規則に従った) 任意の構造体に置き換えることができます。今回の HelloWorld アプレットでは AEEApplet をそのまま使うことにします。
BREW アプレットの作成
ユーザーが携帯電話の BREW アプレットの一覧からアイコンを選択して起動すると、 BREW 実行環境は、 AEEClsCreateInstance() 関数を呼び出して BREW アプレットを作成するように要求します。
AEEClsCreateInstance() 関数では、要求された BREW アプレット構造体を作成して返す必要があります。一つの BREW モジュールには複数の BREW アプレットを含めることができるため、個々の BREW アプレットを区別するために、1番目の引数にクラス ID を指定して呼び出してきます。
AEEClsCreateInstance() 関数に指定されたクラス ID が、あなたが開発している BREW アプレットに等しい場合にだけ、その BREW アプレットを作成して返します。
これを実現しているのが、 BREW ウィザードが生成した下記のコードです。
// // ユーザーがアプレットを起動要求したときに、呼び出されます。 // 開発者は指定されたクラス ID の BREW アプレットを作成して返すことで、 // BREW アプレットを起動します。 // int AEEClsCreateInstance( AEECLSID ClsId, // クラス ID IShell * pIShell, // シェル インターフェイス IModule * po, // モジュール インターフェイス void ** ppObj) // 作成したアプレットを返すポインタ { *ppObj = NULL; // クラス ID が HelloWorld アプレットの ID に等しい場合、 // HelloWorld アプレット構造体を作成して返します。 if (ClsId == AEECLSID_HELLOWORLD) { if(AEEApplet_New(sizeof(AEEApplet), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER) HelloWorld_HandleEvent, NULL)) { return AEE_SUCCESS; } } return EFAILED; }
このコードでは、 BREW 実行環境が AEECLSID_HELLOWORLD というクラス ID の BREW アプレットを要求してきた場合だけ、アプレット構造体を作成して返しています。
アプレット構造体の作成は AEEApplet_New() という関数を呼び出すことで行います。この関数は、 AEEApplet 構造体のメモリを確保し、 AEEApplet 構造体にイベント ハンドラである HelloWorld_HandleEvent() を結びつけることでアプレット構造体を作成しています。
HelloWorld のクラス ID をソースコードで使用しているため、ソースコードに HelloWorld.bid ファイルをインクルードする必要があります。 HelloWorld.c の冒頭に、
#include "HelloWorld.bid"
と書いておいてください。