Last updated: "2004/12/12 22:55:00 +0900"

小松平良樹プレゼンツ

TIPS about CASSIOPEIA A-11

CASSIOPEIA A-11 を使う上でなんかネタを見つけたらメモ的に書いてみよう。

でもネタはさすがに少ないだろうなあ。


WindowsCE1.0 development with EVT3.0

あのwodeonの 作者さん、omiokone さんが、 CE1.0/2.0開発環境の構築 という情報を公開してくださっています。 eMbedded Visual Tools 3.0 と H/PC2.0 SDK を使って、WindowsCE1.0, WindowsCE2.0 の アプリを作ろう! という内容です。

omiokone さんご提供のその情報にしたがって作ったプログラムを、A-11 で 動かしてみようとしました。

が、動きません。

いろいろとあがいた結果、リンカオプションに次のおまじないをつければよいらしい、 ということがわかりました。

/fixed:no

あがいた経緯はそのうち書きたいなあとか思ったりもするのですが、 でも役に立つ情報は書けないかもなあ。まあいつかそのうちに書くかもしれません。

CASSIOPEIA A-11 (CPU:SH3, WindowsCE1.0) で動くソフトを作りたかったんだ。 でも、その exe ファイルが PERSONA HPW-600JC (CPU:SH4, WindowsCE2.11) でも そのまま動くとうれしいよね。 いっしょに次のおまじないもつけてしまいましょう。

/align:4096

/align:4096 はきっと、できあがる exe ファイルを大きくしそうな気がするので、 「この exe ファイルは SH4 では絶対に動かさないぞ!」という強い信念を持って 作るプロジェクトでは、つけないほうがよいのかもしれません。

上記おまじないでなんとなく動く exe ファイルを作ることができるのですが、 DialogBox() はなぜか正常動作しません。exception が発生してしまいます。

WindowsCE1.0 と WindowsCE1.01 で、なんか違うのかもしれませんね。 私は CE1.01 の機械は持っていないので、確認はできません。

たぶん同じ理由(?)で、A-11 では omiokone さんご提供の wodeon の exe ファイルは動きません。not a valid CE program。とか怒られてしまいます。

上記のリンカオプションをつけてソースから build すれば動くものが作れそうな 気がしていますが、試していません。

実はソースからごにょごにょしなくても、exe ファイルをバイナリエディタで ごにょごにょしてなんとなく動くようにできたのですが、 いまさら A-11 の話を急いですることもないでしょう。このネタはまたいずれ。 とか出し惜しみするほどのことではないのですが、ちゃんと書くだけの時間と心の 余裕がない。。。


DialogBox() を使う

上のほうで、「DialogBox() はなぜか正常動作しません。exception が発生してしまいます。」と 書きました。 DialogBox() が使えないとやっぱりいろいろとアレですよね。 で、これを回避する (使えるようにする) 方法を見つけました。いえー。

DialogBox() を使う前に、次のおまじないをしておきましょう。

#undef FindResource
extern "C" {
WINBASEAPI
  HRSRC
    WINAPI
      FindResource(
          HMODULE hModule,
          LPCWSTR lpName,
          LPCWSTR lpType
          );
}

これでOKなり。

EVT というか EVC というか? それが持っているヘッダファイルを 書き換えちゃっていいや。と割り切るならば、そっちの方がいいかも。 わかんないけど。winbase.h 内に FindResource に 関する #define があるので、これを適当に変えるといいかも。

H/PC2.0 SDK の coredll.lib では、FindResource() と FindResourceW() という 関数が export されています。

ソースコード中に DialogBox() と書くと、winuser.h の #define によって、 FindResourceW() を使う内容に置きかえられます。

ここまでは事実。以下は私の勝手な予想です。

WindowsCE1.0 の coredll.dll には、FindResource() という関数はあるものの、 FindResourceW() という関数はないんじゃないのかなあ? (予想1)

H/PC2.0 SDK における coredll.lib 内の FindResouce() の存在意義は よくわかんない (FindResource() ではなく FindResourceW() が使われるから) のですが、 予想1 が正しいならば、backward compatibility のためなのかもしれない。


さて、以上の tips (/fixed:no, FindResouce()) によって、wodeon1.7 を A-11 上で 普通に動かすことができました。いえー。

2004/11/26 現在、omiokone さんは wodeon のページにて、 WindowsCE1.0 用 (WindowsCE1.01 用ではない) の wodeon17s.zip という特別版を 配布されています。 これは上記 DialogBox() のワザを見つける前のリリースでした。 そのため、DialogBox() を使わなくても OK な UI になっています。

DialogBox() のワザを見つけた後、そのワザを使って version1.7 を build してみた ところ、A-11 で正常に動作することを確認しました (DialogBox() の動作を含む)。

リクエストがあれば、WindowsCE1.0 (not WindowsCE1.01) で動く版を 置こうかと思っています。希望される方はご連絡を。でも、面白いから、 自分で build してみるのもいいですよ。



ホームページ
mail