起動しないCEアプリを動くようにする

Windows CE アプリケーションの中には、Brain でダブルタップしても何も起こらなかったり、強制シャットダウンされたりして使えないものも多くあります。このページでは、そういったアプリを動作させられるかもしれない方法を紹介します。

## TL; DR

アプリが Brain で動かない原因は、主に以下が考えられます。

* そもそも Windows CE 用アプリでない
* Windows CE 用でも CPU アーキテクチャが違う
* DLL が不足している
* DLL 自体は存在するが、関数が不足している

よって、以下で動作する可能性が高いです。

* **Windows CE 用のアプリであることを確認する**
* **Arm 用であることを確認する**
* **MioPocket の System/CE5 フォルダや Sea of DLL に入れる**
* **coredll.dll ハックを行う**

## XXX is not a valid Windows CE application.

アプリを起動したときにこのメッセージが出たら、そのアプリは **Windows CE 用でない**か、**異なる CPU アーキテクチャ向けにコンパイルされたもの**であるか、**破損したファイル**であると考えられます。

まずは、再ダウンロードして再度実行してみてください。Brain はファイルシステムをよく壊すので、本体メモリーでも試してみると良いかもしれません。以上で直らなければ、次に進みます。

MioPocket の Program フォルダにある「**PEINFO.EXE**」を Brain で実行します。その後、メニューの「File」->「Open」を押し、ダイアログで EXE ファイルを選択します。OK を押してしばらくすると詳細が表示されるので、そこで以下の項目を確認します。

File Header -> Processor type
4 行目の「Processor type」項目に**「01C0(ARM)」「01C2(Unknow)」以外**が出ていたら、そのアプリは Brain の CPU アーキテクチャ (Arm) 向けではありません。ここが違えば、次の「Subsystem」が正しくても動きません。ダウンロードしたサイトで他のバージョンが用意されている場合、「**ARM**」と書かれたものを選び直してください。
Optional Header -> Subsystem
少しスクロールしたところに Subsystem という項目があります。スクロールすると表示が崩れますが、文字を選択すれば正常になります。ここが「**0002(Windows GUI)**」となっている場合、それは Windows NT 用です。Brain で動作するのは「**0009(WindowsCE)**」のものです。
Windows CE 用 .NET Framework で作られたアプリの場合はこの限りではありませんが、そもそも Brain で .NET Framework は動きません。

なお、解析に失敗した場合はコンテキストメニューが表示されます。失敗する原因の多くは EXE が UPX で圧縮されていることなので、**Windows PC 上で**、**MioPocket 4.0** に含まれる「Extras」->「Win32」->「UPX(Compressor)」->「decompress.cmd」にその EXE ファイルをドラッグ & ドロップして解凍し、もう一度 PEInfo に掛けてください。

## 落ちる・フリーズする

落ちる場合、**`/Windows/MyJITDebugger.exe`** を適当な EXE で上書きすると、強制リセットの代わりに上書きした EXE が実行されます。その状態で **Scalpel** のログを見ると、手掛かりとなる情報が出力されているかもしれません。

フリーズする場合、まずは少し待ちましょう。なかなか終わらない場合は、まず「**シフト**」を押して左上に表示されたらハングしていないので、もっと待てば完了する可能性があります。表示されなかった場合は、ハングしている可能性が高いのでリセットしましょう。MioPocket などで表示されないようになっている場合は、**Brain の画面を閉じてその隙間から液晶を覗きます**。画面が消えている場合は、おそらく処理中です。重いときのサスペンドは遅いためおそらくバックライトが消えているだけで、また画面を開いてしばらくするとサスペンドするはずです。そして、消えない場合はハングしています。背面のリセットボタンでリセットしましょう。

なお、Windows CE 2.11 用が落ちるので HPCPRO2000 用を代わりにダウンロードしたら動いた、ということもありました。**ダウンロードするバージョンを変えてみる**のも手です。また、後述の方法で DLL を追加している場合、その**追加した DLL が壊れている・相性が悪い**という場合もあります。

## 何も起きない

起動しようとしても何も起きない場合は、DLL 関係のことが多いです。

作業の前に Windows CE における DLL について説明しておきます。Windows CE はプログラムに DLL を要求されたとき、

* メモリ上に同名の DLL が読み込まれている (他のプログラムが同名の DLL を使っている) なら、それを使います
* メモリ上になければ「EXE があるフォルダ」「\Windows フォルダ」の順で DLL ファイルを探し、メモリに読み込みます

以上の処理で DLL が見つからなかった場合、CE 4.1 や CE 5.0 では「ライブラリが見つかりません」という趣旨のメッセージが出たのですが、CE 6.0 からはなぜか何も表示されなくなってしまいました。なので、**何も表示されないなら大抵 DLL が原因です**。

先述の PEInfo や Dependencies 等でも EXE がインポートする DLL は確認できますが、その中に実際に必要な関数が揃っているかまでは確認してくれません。よって、MioPocket の「MioAutoRun」->「Programs」->「TroNik」->「Run.exe」にある **TroNic Run** を使います。起動して「Browse...」で EXE ファイルを選択し、実行するとメッセージが表示されるはずなので、それに従って以下の手順を行います。**これをメッセージが表示されなくなるまで繰り返します。**

### Could not load XXX.dll from any of the following directories:

XXX.dll が見つからないようです。**Sea of DLL** (V1.2/V2.0) か、**MioPocket** の「System」フォルダから目的の DLL を持ってきましょう。どちらにもない場合は、MioPocket 内全体を DLL 名で検索すると見つかるかもしれません。なお、**セキュリティソフトが Sea of DLL に含まれるファイルを誤検出する場合がある**ので、使っている人は例外設定を行うか無効化しておきましょう。

### \XXX\XXX\XXX.dll does not export function with ordinal number: YYY

XXX.dll に YYY という序数の関数が含まれていないようです。XXX.dll を違うものに変えればいいのですが、大抵 XXX.dll は coredll.dll という Brain の ROM に入っているファイルです。Windows CE において全てのアプリは coredll.dll を使うので常に「使用中」となっており、上書きができません。そこで、**フル機能の coredll.dll を別の名前で用意し、EXE の DLL 参照部分にある「coredll」という文字列をバイナリエディタで書き換えることで、無理やり参照先を変更させます**。ただし、これを行ったアプリでは**「ファイルを開く」を含む全てのダイアログが表示されなくなります**。ファイルを開いて編集し、保存するという利用方法が一般的な Office 系ソフトウェアでは致命的ですが、関連付けで開いて上書き保存する等で対処してください。

以下に coredll を変更する方法を示します。フル機能の coredll.dll は、CEをビルドするの手順で取得します。MioPocket や Sea of DLL に含まれる COREDL2.dll や COREDL3.dll は使用できません。

1. 適当なバイナリエディタでアプリの EXE を開きます
	* PC 上でも Brain 上でも構いません。Brain なら PEInfo にバイナリ編集機能があります。PEInfo でファイルを開いた後、ツールバーの鉛筆ボタンを押して編集モードに切り替え、もう一度解析が終わったら Tools メニューの Hex view/edit でバイナリエディタが開きます。
2. バイナリエディタで「**COREDLL**」という文字列を **ASCII で検索**します
	* PEInfo では、エディタ右側をタップし検索ダイアログを表示させ、左から 2 つ目の ASCII モードになっていることを確認し、入力欄に「COREDLL」と入力して OK を押します。検索時、**大文字小文字は区別されます**。
3. 見つかった「COREDLL」を「COREDL2」等に書き換えます
	* この編集によって EXE のファイルサイズが変化すると破損するので、同じ長さのファイル名にします
4. 用意したフル機能の coredll.dll を 3 で設定した名前 (この例では coredl2.dll) に改名し、アプリのフォルダに入れます
5. 再び TroNik Run を実行し、coredll.dll のエラーが消えたことを確認します

以上の作業を行った上でも「coredll.dll does not export function...」が出る場合は、同梱の DLL についてもバイナリエディタで開き、同様の作業をする必要があるかもしれません。

なお、「coredll.dll does not export function...」エラーは Handheld PC 用アプリに多いです。**Windows Mobile 用や Pocket PC 用**が提供されている場合はそちらも試してみましょう。解像度が合わない、表示が崩れる、aygshell.dll などの DLL が沢山要るといった場合がありますが、coredll.dll ハックを回避できるかもしれません。

### なにもメッセージが表示されない

MioPocket 内全体を追加した DLL 名で検索し、違うファイルサイズのものがあれば、それで置き換えればもしかしたら動くかもしれません。それでも起動しない場合、諦めてアプリのバージョンを変えるか、他のソフトに移りましょう。

ちなみにとあるアプリがこの状態になりましたが、実はバグで元々そのバージョンは起動しなかった、なんてこともありました。

1. ↑ 初心者の中には、セキュリティソフトは必須と教えられてきたためにこの説明に驚いた方もいるかもしれません。詳細は省きますが、最近のセキュリティソフトは個人が作成したマイナーなソフトウェアを、大した根拠もなくマルウェアであると判断する傾向にあります(その方が検出率を稼げるのでしょうか)。それゆえ、ソフトウェア開発を行う上では事前に無効化や開発フォルダの除外設定を行うのが常識になっています。今回に関してはそもそも PC では実行すらできない Windows CE 専用 DLL ですから、有害なわけがありません。