そもそもExpress EditionにはATLが入っていないため、QMAIL3がコンパイルできないので、Standard Editionを入れてビルドしてみました。いくつか変更が必要だったのでそのメモです。
wcsicmpがObsolete
非互換なので_wcsicmpが正しいのですが、_を付け忘れていたところがいくつかあってコンパイルエラーになっていました。
ちなみに、_wcsicmp_lのようにロケールを渡せるバージョンも追加されています。
strcpyなどがセキュアでないのでObsoleteと言われる
strcpy_sなどを使えという事のようですが、素直に変えるとWindows CEの方で困るので、_CRT_SECURE_NO_DEPRECATEを定義して警告が出ないようにする必要がありました。
strcpy_sなどは、固定長バッファを使う場合には、Secure Template Overloadsを使ってコードを書き換えなくてもセキュアなバージョンを使えるような工夫がされていますが、ポインタを使っている場合には手で書き変える必要があります。Parameter Validationを見ると不正なパラメータを渡されたときにはハンドラが呼ばれるようになっていて(デフォルトのハンドラはAccess Violationを発生される)、悪意のあるデータを書き込まれにくくなっているようです。
swprintfの定義が変わっている
ISOのswprintfの定義はバッファのサイズを引数に取りますが、今まではsprintfに合わせたバッファのサイズを取らないバージョンも用意されていました。これが、Obsoleteになりました。バッファのサイズを引数に取るswprintfに書き換えるとWindows CEの方で困りそうなので、_snwprintfに置き換えました。
_CRT_NON_CONFORMING_SWPRINTFSを定義して警告がでないようにするというのもお勧めではないもののありかもしれません。
wcschrやwcsstrがオーバーロードされている
例えば、wcschrのプロトタイプは、
wchar_t* wcschr(const wchar_t*, wchar_t);
ですが、C++では、
wchar_t* wcschr(wchar_t*, wchar_t); const wchar_t* wcschr(const wchar_t*, wchar_t);
のようにオーバーロードされるようになりました。
wabtags.hに0xa0が入っている
同梱のPlatform SDKのwabtags.hのコメント内に0xa0が入っているので、CP932な環境でコンパイルすると警告されます。これは、置換して直す方向で。既にフィードバックにレポートされているのに直っていないようです。
ちなみに、普通にダウンロードできるPlatform SDKの方も同じ問題があります(ただし、VC7.1までは警告しないので気づきません)。
wabdefs.hでWCHARが定義されている
VC8ではwchar_tをネイティブ型として扱うコンパイルオプションがデフォルトで有効になっているため、wabdefs.hの、
typedef WORD WCHAR;
でエラーになります。
普通にダウンロードできるPlatform SDKの方ではここに加えてmapidefs.hにも同じ問題があったのですが、そちらは直っているのに、こちらは直っていませんでした。ここもコメントアウトしてしまうしかないでしょう。
crypt32.libが入っていない
同梱のPlatform SDKになぜかcrypt32.libが入っていないので、どこかから持ってくる必要があります。
manifestのマージが必要
msvcr80.dllを使うのにmanifestに情報を書く必要があるのですが、元々コモンコントロール6.0を使うmanifestを入れて入るのでマージする必要があります。
mt.exe -inputresource:q3u.exe -manifest q3u.exe.manifest -outputresource:q3u.exe
としてマージすれば良いようです。ちなみに、msvcrt80.dllを使うためのmanifestはリンカが勝手に生成してくれます。
manifestの生成に関しては、Understanding Manifest Generation for C/C++ Programsに書いてあります。
ついでにいくつか気づいた事を。
64bitコンパイラ
機能比較表によると、Standard Editionには64bitコンパイラは入っていないことになっていますが入っています。
STL.NETが入っていない
STL.NETは結局入らなかったようです。つまらない…
サポートしているWindows CEのSDK
IDEからプロジェクトの作成をするとサポートしているのは、Pocket PC 2003とWindows Mobile 5.0のSDKだけのようです。ちなみに、ライブラリが用意されているのは、armv4, armv4i, mipsii, mipsii_fp, mipsiv, mipsiv_fp, sh4, x86でした。
それはともかく、コンパイラのファイル名がみんなcl.exeになっていたり、/MCがなくなって/MDを使うとCE版のmsvcr80.dllを使うようになっていたり*1、色々と変わっています。
DeviceResolutionAware.h
AppWizardで生成したコードがPocket PC版ではDeviceResolutionAware.hを使っています。このヘッダは、Developing Screen Orientation-Aware Applicationsにあるサンプルコードとほぼ同じようなもので、高DPIやランドスケープモードに対応するためのユーティリティ関数が入っています。
続く…かも
*1 今まではcrtの関数もcoredll.dllがエクスポートしていた
> STL.NETが入っていない<br><br>STL/CLI(STL.NET)は、後日、ダウンロードできるようになるようです。
> wabtags.hに0xa0が入っている<br><br>あれ?RTM(英語)では、デスクトップ版でビルドした場合には出なくなりましたけどねえ。。<br>#あのフィードバックは、私が出したものですw<br><br>> wabdefs.hでWCHARが定義されている<br><br>こちらについては、私のBlogのほうで対応方法を書きました。<br>よかったら、参考になさってください。(ベタな対応方法ですが)<br><br>http://www.ailight.jp/blog/sha256/archive/2005/11/02/10019.aspx
情報ありがとうございます。<br><br>wabtags.hが違うのが解せませんね。ちなみに私が試したのは、Standard EditionでVersion 8.0.50727.42 (RTM.050727-4200)(MSDN Subscriber Downloadsからダウンロードしたもの)です。
以下のMSDN Product Feedbackのとこに、Voteとコメントを書き入れれば、VS2005SP1あたりで直るかもしれませんよw<br><br>■wab.h をインクルードするとエラーが発生 - MSDN Product Feedback<br>http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=67ceb8ea-a46a-4acc-8220-eeec20a0b6b1