2005-11-10 [長年日記]

[Q3] VC8でビルドしてみる

そもそも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に書いてあります。

Visual Studio 2005

ついでにいくつか気づいた事を。

  • 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がエクスポートしていた

本日のツッコミ(全4件) [ツッコミを入れる]
# 社本@ワック (2005-11-10 12:35)

> STL.NETが入っていない<br><br>STL/CLI(STL.NET)は、後日、ダウンロードできるようになるようです。

# 社本@ワック (2005-11-10 12:39)

> 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

# snak (2005-11-10 13:28)

情報ありがとうございます。<br><br>wabtags.hが違うのが解せませんね。ちなみに私が試したのは、Standard EditionでVersion 8.0.50727.42 (RTM.050727-4200)(MSDN Subscriber Downloadsからダウンロードしたもの)です。

# 社本@ワック (2005-11-18 08:49)

以下の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


トップ «前の日記(2005-11-09) 最新 次の日記(2005-11-11)»