HOME REPORT C++BUILDER5 から C++BUILDER2009 BDS2009 への移行について

C++Builder5 から C++Builder2009 BDS2009 への移行について

概要
C++Builder2009 へ C++Builder5 からプロジェクトを移行すると様々な問題が発生します。それらに対処するためのレポートです。
レポート日
2009.3.26

手順

かならずバックアップを取ってから自己責任で行ってください。

1.プロジェクトを変換する

まず普通に以前のプロジェクトファイルを開いてプロジェクト変換をします。

2.lib ファイル等の読み込み直し

プロジェクトマネージャから、旧ビルダーのフォルダからインクルードされている lib ファイルを削除、代わりに新しい ビルダーのフォルダから lib ファイルを追加する。

3.プロジェクトにある古いパスを新しいパスに変更する

プロジェクトオプションのページでパスが記載されている項目を一つずつチェックする。以前のコンパイラのパスが指定されている物があるので、その部分を削除する。ディレクトリと定義条件という項目全部。

4.不要なオプションの削除

プロジェクトオプション→リソースコンパイラ→追加オプションの項目を空欄にする。

5.プロジェクトファイルをテキストエディタで編集する

いったんプロジェクトを閉じて、新たに作られたプロジェクトファイル(.cbproj)をtテキストエディタで開く。そのなかの Compiler セクション <Compiler>から</Compiler>を削除する。同様に何カ所かある <BCC_UserSuppliedOptions> セクションを削除する。互換性オプションの引数等を削除しないと Compiler セクションが復活してしまい、コンパイル出来ないことがある。私は綺麗さっぱりセクションごと削除することにしました。ちなみにこのファイルのフォーマットは UTF-8 で改行コードは CR+LF です。これを変更してしまうとプロジェクトが開けなくなることがあります。

6.プロジェクトを開く

プロジェクトを IDE で開いてみます。プロジェクトオプションのデバッグ、リリースの文字が崩れていることがあるのでこれを修正します。

7.言語上の仕様変更を行う

Unicode になってしまった部分への対応を行います。2通りの解決法があります。

7.a.以前のプロジェクトを Unicode 対応にする

以前のプロジェクトを Unicode 対応にするのは結構大変です。文字列や文字の前に L をつけていきます。char を wchar_t か TCHAR に変更したりします。プロジェクトオプションの _TCHAR のマップ先を wchar_t に変更する。

リンク時に
[ILINK32 エラー] Error: 未解決の外部参照 'wWinMain' が C0W32W.OBJ から参照されました
というエラーが多分出ます。その時には WinMain を
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
と書き換え、vcl のインクルードの後に
#include <tchar.h>
と記入して tchar.h をインクルードする必要があります。

7.b.いちいち変換する。

VCL から受け取った UnicodeString を AnsiString にキャストしていきます。こちらで注意する点は TStringList のようなものを使っていた場合、これの内部変数は UnicodeString になっているので自分で AnsiString 版を作る必要があると言うことです。Unicode 版しかなくなってしまったメソッド類も AnsiString から Unicode に変換して渡してやります。

どちらの方法も手間はかかります。ちなみに、TStrings->LoadFromFile は先頭にバイトオーダーマークの有無をチェックして Unicode か S-JIS かどうか自動で判別してファイルを読んでくれるみたいです。同様に保存する場合もフォーマットを指定できるようです。

8.コンパイル

コンパイル時に、「DCLUSER.lib ファイルが見つかりません」というエラーが出るかも知れませんが、これはキャンセルして OK です。

筆者は C++Builder6 は持っていませんが、6 のユーザーの方も同じような感じで移行できると思います。はっきり言って大きいプロジェクト(フォームが20以上あるような)を作り直すというのは非常に面倒です。出来るだけ楽をしましょう。