2004-12-31 [長年日記]

[Q3] Windows CEエミュレーション

以前のWindows CEのエミュレーションは役に立たないことが多かったのでエミュレーションでのデバッグはまったく使っていなかったのですが、Pocket PC 2002あたりから方法が変わって*1そこそこ役に立ちそうな気もしていました。高DPIでの動作はやはり試してみないとわからないのでサンプルプログラムをエミュレータ上で走らせていたのですが、やはりそれだけだとわからないことも多いのでQMAIL3のエミュレーション版もビルドできるようにしてみました。

QMAIL3のビルド環境はQMAIL2時代から引き継がれてきたgnu make用の手書きのmakefileなので、環境に適応するのがちょっとばかり面倒です。今までのエミュレーション用設定でビルドすると幾つかのコンパイルエラーがでてしまい、それを回避してもほぼすべてのAPIがリンクエラーになってしまいます。調べてみると、Windows CEではデフォルトの呼び出し規約がAPIも含めてcdeclなのですが、stdcallになっているのが原因のようです。色々調べて以下のところを変えてうまくいくようになりました。

  • -Gzをはずす

    以前のエミュレーションはWindows向けのアプリケーションだったので標準の呼び出し規約がstdcallだったのですが、今のエミュレーションは普通にcdeclになっています。

  • -D _WIN32_WCE_EMULATIONをはずす

    これがついていると

    #define _stdcall _cdecl
    #define __stdcall __cdecl

    あたりが定義されずにやはり呼び出し規約が異なってリンクできません。

  • サブシステムをwindowsceにする

    以前のエミュレーションでは-SUBSYSTEM:WINDOWS,4.0でしたが、通常のWindows CEアプリケーションと同様に-SUBSYSTEM:WINDOWSCE,4.21にします。

後はincludeとlibのパスを少し調整したらうまくビルドできるようになりました。

これでWM2003(SE)あたり向けのバグ取りも楽になったかもしれません。

*1  以前のエミュレーションは普通のWindows上で動作するアプリケーションにWindows CE専用のAPIを提供するライブラリを提供して動かすイメージでしたが、新しいエミュレーションではVirtual PC上でx86版のWindows CEを走らせているようなイメージになっています。たぶん。

[]