読者です 読者をやめる 読者になる 読者になる

C++Builder2009の新機能 その3(プロジェクト移行編)

その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さん目から鱗。ありがとう。