C++Buildre旧バージョンのプロジェクトを利用 ======================================== 私は、C++Builder 5 を持っている。そのプロジェクトを C++Builder Community Edition に移行したので、その留意点などについて残す。 「[[https://community.idera.com/developer-tools/b/blog/posts/cpp-oldproject-on-recent-cppbuilder-ja|最新のC++Buidlerで旧バージョンのプロジェクトを利用する方法]]」記載の手順で、自動コンバートは出来ないので新規プロジェクトを作成し、ソースをコピーして`*.cpp`をプロジェクトに追加していく。一部、ソース修正が必要。 1. C++Builder Community EditionでC++プロジェクトを新規に作成し、プロジェクトを保存する。 2. プロジェクトにデフォルトで作成されるユニットを削除する 3. 旧プロジェクトのユニットを新しいプロジェクトに追加する(`*.cpp`,`*.h`,`*.dfm`) 4. プロジェクトのメインモジュール(プロジェクト名.cppやプロジェクト名PCH.h)に旧プロジェクトのコードをコピーする ソースの修正が必要だった点 ------------------------ Windows環境ではファイル名の大文字小文字は区別されないが、`#include`ファイル名と実際のファイル名が合致していないと警告が出るので、ファイル名の大文字小文字を合わす。あと、ソースに漢字を含んでいる場合は、全て「UTF-8」文字コードBOM付に変更。(Wzエディターで変換し上書き保存) ### ヘッダファイルが見つからない コンパイルするとヘッダファイルが見つからないエラーが発生する場合がある。エラーとなるヘッダファイルの`#include`行を削除する。必要なヘッダは自動的に追加される。尚、``と``は共通プリヘッダファイル「`<プロジェクト名>PCH.h`」に記述があるので、各ユニットファイルへの記述は無くても大丈夫。 ### 文字列の扱いの違い RAD Studio 2009 バージョン以降で、[[programing/cpp_builder/cpp_builder-unicode|C++BuilderはUnicode対応]]となり内部の文字列の扱いが変更になっている。従来の文字列はバイト単位のchar型だったが、漢字などの[[wpjp>マルチバイト文字]]を扱う[[wpjp>ワイド文字]]型に変更になっている。その関係で以下のようなエラーが発生したりする。 ``` [bcc32c エラー] DSnd.cpp(46): no matching function for call to 'MessageBoxW' winuser.h(8941): candidate function not viable: no known conversion from 'const char [29]' to 'LPCWSTR' (aka 'const wchar_t *') for 2nd argument ``` この対応は、下記のように文字列の前に `L` 指定を追加する。 MessageBox(NULL, "バッファーのアンロックに失敗", "Error", MB_OK); ↓ MessageBox(NULL, L"バッファーのアンロックに失敗", L"Error", MB_OK); ### 従来のBCC32でコンパイル デフォルトでは、clangベースのコンパイラを使うようになってるが、一部互換のない記述を使っている場合は、とりあえず従来の`BCC32`でコンパイルするようプロジェクトを設定変更する。 【参考】 * [[https://qiita.com/ht_deko/items/36115af8a57636257445|C++Builder とトライグラフ]] ### レジストリやINIファイルを扱うヘッダの変更 レジストリ関連を操作するヘッダファイルは「`#include `」に記述変更。 INIファイル関連を操作するヘッダファイルは「`#include `」に記述変更。 【参考】 * [[http://www2.ttcn.ne.jp/~tkky/Tips/Registry/registry2.htm|Registry で Form の位置を記録 ]] * [[http://www2.ttcn.ne.jp/~tkky/Tips/IniFiles/inifiles1.htm|Form の位置を IniFile に記録 ]] * [[http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Registry_TRegistryIniFile.html|TRegistryIniFile Class]] ### リンクエラー(System::UnicodeString, Vcl::Controls::TWinControl) 下記のようなリンクエラーが発生。 ``` [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::SelectDirectory(System::UnicodeString,System::WideString, System::UnicodeString&, System::Set, Vcl::Controls::TWinControl *)' ``` プロジェクトファイルの``に`vclx.lib`を追加するとリンクが成功。 【参考】 * [[http://konishih.hateblo.jp/entry/2018/12/29/174741|SelectDirectoryでリンカエラー]] ### max,min関数でエラー 以前は、``をインクルードすれば、max,min関数が使えていたが使えなくなっている模様。下記のマクロを該当ソースに定義し修正して対応。 #define __max(a,b) (((a) > (b)) ? (a) : (b)) #define __min(a,b) (((a) < (b)) ? (a) : (b)) 参考記事 ------- 1. [[http://seclan.dll.jp/dtdiary/2010/dt20100306.htm|bcc32 と msc(cl) のコマンドラインコンパイラの UNICODE 対応化オプション]] 2. [[http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%AE%9A%E7%BE%A9%E6%B8%88%E3%81%BF%E3%83%9E%E3%82%AF%E3%83%AD|定義済みマクロ]] 3. [[http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E9%9D%99%E7%9A%84%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA|静的ランタイムライブラリ]] 4. [[https://www.embarcadero.com/jp/migration-and-upgrade-resources-for-delphi-c-builder-and-rad-studio|旧バージョンからの移行]]