この記事は OUCC Advent Calendar 2020 の 20 日目の記事です。OS として Windows Embedded CE 6.0、CPU に ARM926EJ-S (Armv5TEJ) を搭載する電子辞書 SHARP Brain 用アプリケーションの作成方法を解説します。
注意点
ここで取り扱うものは、SHARP 公式の内容ではありません。通常、フリーズなどが起こった場合も本体裏のリセットボタンを押せば元に戻りますが、万一何らかの問題が発生しても一切補償できませんので、自己責任で試してください。
新機種の多くには、SHARP 公式のソフトウェア以外を起動できなくするプロテクトが掛かっています。具体的には、ビジネスモデル(PW-SBx)を除く PW-Sx4 以降の機種がそれに該当します。そういった機種での起動方法はこちらを参照してください。
この表で第 1 世代から第 4 世代に分類されている機種を対象とします。2021 年以降発売の第 5 世代に該当する機種用のアプリケーションは、この記事の方法では作成できません。
(2024 年 11 月追記)この記事は、Brain Wiki にも同等の内容(環境構築方法のみ)を転記しています。著者は既に OUCC を引退している OB なので、状況に変化があった場合は Brain Wiki 側を優先的に更新します。本記事の手順でうまくいかなかった場合などは Brain Wiki も併せてご確認ください。
プログラム
この記事では、プログラミングよりも開発環境やコンパイル方法など、開発手順の解説に重点を置くため、簡単なプログラムを使用します。brain.cpp
をダウンロードしてください。なお、このプログラムは通常の Windows PC と Windows CE のどちらでも使用できるようにしてあるので、Brain を所持していない方でも Win32 アプリケーションを開発できる環境があれば試すことは可能です。
本格的に開発を行う際は、こちらのノウハウ集も参考にしてください。
開発環境
以下の 3 通りを解説していきます。
- CeGCC
- eMbedded Visual C++ 4.0
- Pocket GCC
Visual Studio 2005/2008 の Professional 以上でも開発可能です。こちらを参照してください。
電子辞書での実行方法
内蔵メモリーまたは microSD カードに日本語で アプリ
という名前のフォルダを作成し、その中にメニューに表示させたい任意の名前のフォルダを作成します。その中に、コンパイルして得られた実行ファイルを AppMain.exe
に改名したものと、空のダミーファイル index.din
を入れます。これにより、「アクセサリー -> 追加コンテンツ -> 追加アプリ・動画」に追加されます。メニューの配置は機種によって異なるので、この通りでない場合は似たものを探してください。加えて、第 3 世代以降の機種の場合、空のダミーファイル AppMain.cfg
を加えることで高解像度状態のまま実行できるようになります。
index.din
及び AppMain.cfg
は空のテキストファイルを作成し、ファイル名を index.din
, AppMain.cfg
(もちろん元の拡張子 .txt
は消す)に変更するだけで作成が可能です。UNIX 系の環境なら touch
コマンドでも作成できます。ceOpener などの別ツールを導入済みなどで、 exe ファイルを直接実行する場合は以上の作業は不要です。どんな名前でもどこに置いても構いません。
CeGCC
Linux, Cygwin, WSL, macOS 等の UNIX 環境で使用できる Windows CE 開発環境です。Windows XP のような古い Windows 環境が不要で、GCC 9.3.0 ベースなので C++17 を完全にサポートしているなど、現在では最も使いやすい環境です。ただし、個人の方が作成されたものだというのもあり、若干癖があります。
まず、こちらを参考に導入します。その後、brain.cpp
を配置したディレクトリで、以下のコマンドを実行します。
arm-mingw32ce-g++ -Wall -Wextra -O3 -std=gnu++2a -march=armv5tej -mcpu=arm926ej-s -static -s -o AppMain.exe brain.cpp
成功すると AppMain.exe
が生成されるので、電子辞書にコピーして実行します。冒頭の画像のようになれば成功です!
しかし、この長いコマンドを毎回入力するのは面倒です。また、ここでは紹介しませんが、リソースを含む場合はそのためのコマンドも必要となり、さらに面倒です。ここで、ビルド作業を自動的に行う shell script を用意しました。ceg++
(C++) / cegcc
(C) を、コマンドラインオプションにソースファイル名(複数可)を指定して実行すると AppMain.exe
が出力されます。カレントディレクトリに resource.rc
があれば、それもあわせてコンパイルします。
注意点
CeGCC のヘッダファイルは通常版 Windows のものが流用されていますが、Windows CE での定数は通常版 Windows とは一部異なるため、これが原因で問題が発生する場合があります。例えば、最小化ボタンを表示させたはずが最大化ボタンが出たりします。そのため、ヘッダファイルを書き換える、正しい数値を直接指定する、正しい数値でマクロ定数を定義しなおす、等の対応が必要となります。今回のサンプルソースでは、冒頭にマクロ数値を補正するコードを記述してあります。Microsoft は初期の頃の Windows CE 開発環境を高値で販売していたようなので、「定数をずらすことでフリー実装の登場を遅らせて、その間に自社の開発環境で儲けよう」みたいなことを企んでいたのかもしれません。
また、CeGCC の公式ビルドはデバッグ情報を取り除く strip 処理が行われていないため、開発したアプリケーションを Brain 上で動かすときに必要な C/C++ ランタイムを普通に静的リンクすると、極端に exe のサイズが大きくなります。これに対応するため、挙げたコマンドやスクリプトでは strip を表す -s
オプションを付けてあります。
eMbedded Visual C++ 4.0
知る人ぞ知る、2000 年頃の Windows CE 用 Microsoft 純正無料 IDE です。激古なので C++ の新しい機能は使えず、Windows 2000 と Windows XP でしかフル機能が使えないという難点がありますが、先述の CeGCC が発見されるまでは唯一の無料で使える開発環境でした。
環境構築
Arm 版の Windows 10/11 を使用している場合は、予め winevdm と ntvdm64.dll をインストールしておく必要があります(DLL 側の Readme の手順に従う)。この方法では eVC4 のインストーラが Standard SDK のインストールまで一貫して行うようです。
まず、 Microsoft Download Center(直リン)からダウンロードします。これは自動解凍式の圧縮ファイルになっているので、実行して適当な場所に解凍します。それで得られたファイルの setup.exe
を実行し、手順に従ってインストールします。途中でプロダクトキーを聞かれますが、先ほどのダウンロードページの「インストール方法」欄に記載されているものを入力すれば大丈夫です。
次に、Windows 2000, XP の場合は Service Pack 4(直リン)、Windows Vista 以降の場合は Service Pack 3(直リン)をダウンロードして、同様の手順でインストールします。
最後に、いずれかの Standard SDK をインストールします。Windows 2000, XP の場合は両方の SDK をインストールしておき、ビルド時にどちらを使うか選択することも可能です。
- Windows Vista 以降であるか、他の CE4 系デバイス(Sigmarion III など)も対象とする場合は、最初に解凍した中身の SDK フォルダに入っている
setup.exe
を実行し、指示に従いインストールします- Windows Vista 以降では Windows XP (Service Pack 3) の互換モードを設定して実行します
- Windows 2000, XP であり、他の CE4 系デバイスを対象としない場合は、Windows CE 5.0 の Standard SDK をダウンロードし、インストールします
- SHARP Brain のネイティブに近いのはこちらです
プロジェクト作成・ビルド
左上の「ファイル(F)」から「新規作成」をクリックします。その後、下の画像のように設定します。CPU に関して、 SHARP Brain は Armv5TEJ ですが、この IDE にはないため ARMV4I を選択します。SHARP Brain 以外の CE デバイス用のビルドも行いたければ、ARMV4I に加えてその他の CPU を選択しても構いません。設定できたら「OK」を押します。
次の画面では、「空のプロジェクト」を選択します。
プロジェクト概要の画面で OK を押すと、プロジェクトが作成されます。
その後、左を FileView に切り替え、Source Files を右クリックしてソースファイルを追加します。分かりやすくなるよう、ソースファイルはプロジェクトフォルダ内に予め入れておくことをお勧めします。
ソースファイルが追加できたら、FileView から先ほど追加したファイルをダブルクリックすると、画面内にソースファイルが表示されます。ここでプログラムを編集することが可能です。今回はソースファイルを UTF-8 エンコードしたためコメントの日本語が文字化けしていますが、無視してください。必要であれば、メモ帳などの別のソフトウェアで Shift_JIS に変換すると正しく表示されます。というか何で Windows CE は Unicode のみ対応なのに、eVC4 は Unicode 非対応なのだろうか…
ここで、SHARP Brain で実行する際は AppMain.exe
になっていた方が色々とうれしい(先述)ので、デフォルトでこの名前になるように設定しておきます。「プロジェクト -> 設定」を開き、「リンク」タブに移動すると下のような画面になるので、画像のように出力ファイル名を編集して OK を押します。
最後に、画面左上の「STANDARDSDK」という部分では、利用する SDK を指定します。Windows CE 5.0 用の SDK をインストールした場合は、STANDARDSDK_500 となります。
これで準備完了です!では、下の画像の赤丸で囲ったボタンを押してください。
ビルド終了後、以下のようなメッセージが出ますが無視してください。コンパイルエラーがなければコンパイル成功です。
プロジェクトフォルダの ARMV4IDbg
フォルダ内に AppMain.exe
が生成されているはずなので、電子辞書にコピーして実行してみてください。冒頭の画像のようになれば成功です!
なお、Win32 (WCE ARMV4I) Debug と書かれているプルダウンメニューから、Release ビルドや他の CPU への切り替えが可能です。
Pocket GCC
SHARP Brain 上でのセルフ開発が可能な GCC の Windows CE 移植版コンパイラです。eVC4 よりさらに機能は限られますが、PC がなくても使用できます。
まず、こちらを参考に導入します。DOS窓Open の準備も必要です。
一通り終わったら、brain.cpp
を win.cpp
に改名したものと WINBUILD.BAT
を電子辞書内の同じフォルダに入れます。この際、WINBUILD.BAT
の 2 行目と 3 行目を環境に合わせて編集しておきます。
その後、DOS窓Open の cd
コマンドでそのフォルダに移動し、WINBUILD.BAT
を実行します。空白や日本語を含んでいても、クォーテーション不要で cd
できます。成功すると AppMain.exe
が生成されるので、これを実行して冒頭の画像のようになれば成功です!
ちなみに、この記事では説明しませんが WINBUILD.BAT
は resource.rc
があった場合、それも含めてコンパイルするようになっています。その際、34 行目の -l commctrl
は Pocket GCC に commctrl.lib
が含まれないため取り除いてください。一応、eVC4 の SDK からこのファイルを持ってくると(大量の警告の下で)使えるようにはなります。
おわりに
今回は、SHARP Brain 用アプリケーション開発の方法をまとめました。SHARP Brain のハックに興味がある方は、Brain で動作する Linux ディストリビューション Brainux の開発やその他の議論が活発に行われているコミュニティ Brain Hackers に参加してみると面白いかもしれません。
Win32 API プログラミングについては一切触れませんでしたが、こちらのノウハウ集が参考になると思います。ただし、ノウハウ集にも記載の通り、Windows における最も原始的な開発方法となるため難易度が高く、C/C++ をそれなりに理解していることが求められます。私も、高 2 の頃 Hello, world!
にたどり着くまでに 1, 2 週間かかりました。さらに Command Bar など、調べても出てこない Windows CE の独自仕様も相当あるので大変です。しかし、電子辞書で自作ソフトが動作する感動はなかなかのものです!
ちなみに、執筆者もいくつかの SHARP Brain 用ソフトウェアをオープンソースで公開しています。執筆地点では素因数分解、超大量ファイル整理、KN MemoPad 機能追加版、Brainfuck for SHARP Brain、tetris がありますので、もしよければ使ってみてください。Win32 API プログラミングに関しても何か参考になるかもしれません。
では、ここまでお読みいただきありがとうございました!OUCC では、現在も部員を募集中です。興味がある方は、ぜひご気軽に Discord サーバーにご参加下さい!