VC6でデバッグビルドでは動くのにリリースビルドだと動かない場合

リリースビルドでもデバッグ情報をある程度付け足してビルドすることができるのでその方法。

1、メニューの「ビルド」「構成」からリリースビルドの構成を元に新しい構成を作成する。

2、プロジェクトの設定の、「C/C++」でデバッグ情報を「プログラムデータベースを使用」にする。「リンク」で、「デバッグ情報を生成する」をチェックする。

3、実行してエラーが出てくれれば、行番号などのある程度の情報はわかる。

上の方法でエラーが出てくれないとき。

1、リリースビルドのプロジェクトの設定の「リンク」で「MAPファイル生成」をチェックし、ビルドすると拡張子MAPのファイルができる。このファイルは関数のアドレス情報がわかる。

2、実行してエラーを再現して、エラーの起きたアドレスを調べる。以下の場合ならアドレスは0x401106になる。

err

3、MAPファイルからこのアドレスがどの関数かを調べる。左の数値ではなく右のほうの400000あたりから始まる数値。

4、頑張ればコールスタックも調べられる。

VC6でUNICODEでビルドする

Visual C++ 6でプロジェクトを作成した場合、デフォルトでANSIで作られる。これをUNICODEでビルドするには、以下の手順で行う。

構成の追加

[ビルド]→[構成]で新しい構成を作成する。ここでは名前を「UnicodeDebug」とした。

UNICODEディレクティブ追加

プロジェクトの設定で、「プリプロセッサの定義」に”UNICODE”と”_UNICODE”を加える。

これを加えることにより、以下のようなプリプロセス処理が行われる。

  • MessageBoxなどのAPIがMessageBoxAからMessageBoxWになる。
  • LPCTSTRのようなTを含む文字列マクロがWCHARになる。
  • _Tマクロで括られた文字列がL””になる。

エントリーポイント

プロジェクトの設定のエントリポイントを”wWinMainCRTStartup”に変える。コマンドラインアプリの場合は”wmainCRTStartup”にする。

WinMainをwWinMainに変える

あるいは_tWinMain見たいのにする。この場合”tchar.h”をインクルードする。コマンドラインアプリの場合は_tmain見たいのにする。

これでリンクするとインストールの状態によっては、MFC40UDがない、みたいなリンクエラーになることがある。これはMFCのUnicdeライブラリなので、このエラーが出た場合は、VC6のインストーラを起動して、MFCのUNICODEライブラリをインストールする。

すでにプロジェクトがある場合

すでにANSIで作ったプロジェクトをUNICODEにする場合は、以下のようにする。

  • リテラル文字列を_Tマクロで括る
  • charをTCHARにする
  • std::stringはtstring見たいなのをtypedefする
  • ANSIのCランタイム関数を使っている場合は、T系に直す。strlen→_tcslen。

ただし、GetProcAddressのようなANSI文字列のみを受け取るAPIもあったりするし、APIの引数に渡すバッファのサイズが文字数単位なのかバイト単位なのかとかも注意しないとならないので大きいプロジェクトの場合は大変と思われる。

デバッグ時にUNICODE文字列を表示する

デバッグ時に変数のツールチップなどにUNICODE文字列を表示するには[ツール]→[オプション]から”unicode 文字を表示”をチェックする。

UNICODEでビルドする利点と欠点

利点

  • NT系OSで速くなる?NT系OSは内部的にUNICODEを使っているので、ANSI→UNICODEの変換が不要になる。
  • 韓国語や中国語が使えるようになる。
  • 日本語以外のNT系OSでも文字化けしないで実行できる。(フォントがある場合)

欠点

  • 98系OSで動かなくなる。

Visual Studio 2008からデフォルトでUNICODEビルドになった。