その1:
C++Builder 5/6/2006/2007から、C++Builder 2009へプロジェクトを移行する場合、一発でうまくいかなかったら、
ぶっちゃけ、プロジェクトを再作成したほうが手っ取り早い*1です。
もちろん、CodeGearを腐すつもりは毛頭無く、以下の理由によるもの。
- C++BuilderでJVCLなどのサードパーティー製コンポーネントを使っている場合、パッケージのファイル名にバージョン情報(hogehoge_C06.libとかfugafuga_D11.bpiなど)が埋められていることが多く、それが原因で「パッケージやライブラリが見つからない」といったエラーを回避できる。
- マニフェストファイルを自動的に埋め込んでくれる。
- リンク時の原因不明のエラーを回避できるかも。(シンボルが見つからないとか、ハングアップとか・・・)
原因不明なエラーってのは気持ち悪いけど、QCに通報したくても「現象が発生する最低限の規模のプロジェクト」ってのが、それなりにサイズがある納品物そのものだったりするから、それはさすがに無理。( ´-ω-)y‐┛~~
その2:
AnsiStringへの参照を受け取る関数に、UnicodeStringを渡すと当然エラー。
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList* pList = new TStringList(NULL); pList->Add("12345"); TestFunc(pList->Strings[0]); delete pList; } //--------------------------------------------------------------------------- void __fastcall TForm1::TestFunc(AnsiString& str) { str = IncludeTrailingPathDelimiter(str); }こんな感じに、文字列型がAnsiStringであることを前提にしているとしくじる。
[BCC32 エラー] Unit1.cpp(22): E2357 参照は 'UnicodeString' で初期化されているが 'AnsiString' 型の左辺値が必要 [BCC32 エラー] Unit1.cpp(22): E2342 パラメータ 'str' は AnsiString & 型として定義されているので UnicodeString は渡せない一番影響が大きいのは、VCL関数のSelectDirectoryかな・・・。
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString DestPath; if (SelectDirectory("Select save folder.", "\\", DestPath, TSelectDirExtOpts() << sdNewUI << sdNewFolder)) { ShowMessage(DestPath); } }こいつをコンパイルしてみると・・・
[BCC32 エラー] Unit1.cpp(23): E2285 'SelectDirectory(const char *,const char *,AnsiString,TSelectDirExtOpts)' に一致するものが見つからない仕方がないので、AnsiStringからUnicodeStringに変えてやる。また、文字列定数もワイド文字列定数に。
void __fastcall TForm1::Button1Click(TObject *Sender) { UnicodeString DestPath; if (SelectDirectory(L"Select save folder.", L"\\", DestPath, TSelectDirExtOpts() << sdNewUI << sdNewFolder)) { ShowMessage(DestPath); } }この辺は1年前に覚悟というか予想はしていたけど、これ、ヘルプだとAnsiStringのままなんだよな・・・。
*1:つまり、新規プロジェクトを作成して、Unit1をプロジェクトから削除。その後、移行するプロジェクトのソースを全て新規プロジェクトに追加する。 2chム板"C++Builder相談室 Part19"の77さんのレスより。77さん目から鱗。ありがとう。