このファイルには、製品の主要な文書に書かれていない重要な追加情報が記載されています。このファイルのすべての内容に目を通されることをお勧めします。
このドキュメントで "本製品" とは、Delphi 2007 for Win32 および C++Builder 2007 の両方を指します。
インストール、配布、およびライセンスの問題については、Install、Deploy、License の各ファイルを参照してください。これらのファイルは、デフォルトで C:\Program Files\CodeGear\RAD Studio\5.0 に置かれています。
DLL を動的にロードする場合、動的リンク RTL は使用できません
DLL を動的にロードする場合、ランタイム ライブラリを動的にリンクできません。ロードしない場合は、プログラムを終了すると、アクセス違反が発生します。回避策は、プロジェクト オプションの [リンカ|リンク] ページにある [リンク] セクションの [動的 RTL] チェック ボックスをオフにします。
GdiPlus ライブラリでは #define NO_STRICT をオフにする必要があります
C++ の GdiPlus ライブラリは、非 STRICT モードでは使用できません。これは Graphics::Graphics(HDC) が Graphics::Graphics(HWND) と区別できる必要があるからです。非 STRICT モードでは、HWND と HDC はともに "void*" です。別のモードでは、次のエラーが発生します。
[C++ Error] GdiplusGraphics.h(37):E2015 Ambiguity between 'Gdiplus::Graphics::Graphics(void *)' and 'Gdiplus::Graphics::Graphics(void *,int)'
ActiveX
C++ Builder 6 で作成された ActiveX ライブラリ プロジェクトを C++ Builder 2007 で開き、実行すると、[ActiveX サーバーの登録] と [ActiveX サーバーの削除] メニューが有効になりません。
回避策は、
[実行|実行時引数...] を選択して、[ホストアプリケーション] に "C:\windows\system32\regsvr32.exe"、[パラメータ] に <プロジェクト名> を設定します。
先頭へ
旧バージョンの C++ コンパイラとのバイナリ非互換性
C++ ランタイム ライブラリが強化され、最新の Dinkumware 5.01 に変更されました。この変更に伴って、C++Builder 2007 のコンパイラによって生成されたバイナリ オブジェクトが、旧バージョンでコンパイルされたものと異なる場合があります。非互換の部分は、主に C++ 標準ライブラリに限定されます。基本的な C++ アプリケーション バイナリ インターフェイス(ABI)については変更ありません。
デフォルト値 nil を持つ Delphi インターフェイス パラメータの扱いが変更されました。Delphi インターフェイスに void * 型を割り当てると、コンパイル エラーが発生します。
以前の Delphi コンパイラ(DCC32)は、インターフェイス パラメータがデフォルト値 nil を持つ場合、.hpp ファイル内に次のようなコードを生成しました。
void methodName(_di_IIntf param = (void *)(0x0));
C++ コンパイラは、以前は、この構文を誤って受け入れていました。
このリリースでは、Delphi コンパイラおよび C++ コンパイラの両方で、この場合の扱いが変更されています。
Delphi コンパイラは、デフォルト値 nil を持つインターフェイス パラメータに対して、.hpp ファイル内に次のようなコードを出力するようになりました。
void methodName(_di_IIntf param = _di_IIntf());
C++ コンパイラは、Delphi インターフェイスに "void *" 型を割り当てたコードに対して、エラーを出力するようになりました。
たとえば、次の行は
void methodName(_di_IIntf param = (void *)(0x0));
コンパイルに失敗し、次のエラーが出力されます。
Cannot convert 'void *' to '_di_IIntf'
デフォルト値 nil を持つインターフェイス パラメータを含む Delphi コードがある場合は、DCC32 で再コンパイルしてください。ソースがない場合は、.hpp ファイルを編集し、該当箇所をすべて次のように変更してください。
void methodName(_di_IIntf param = (void *)(0x0));
これを次のように変更します。
void methodName(_di_IIntf param = _di_IIntf());
Delphi コードに対する両方のシンボル参照情報オプションの選択
C++Builder プロジェクト内で Delphi コードをコンパイルする場合、現在は、
[プロジェクト...|オプション|Delphi コンパイラ|コンパイル]
ダイアログ ボックスのシンボル参照情報オプションのいずれか 1 つのみ([定義のみ] または [参照情報] のいずれか)を選択できます。ただし、以下のソースレベル指令($
xx
)を使用すると、 これらのオプションの両方を選択することができます。
-
定義情報($YD)オプション: Delphi コンパイラは、各識別子が定義されている場所についての情報を記録します。変数、定数、クラスなどのほとんどの識別子に対して、コンパイラはその宣言の場所を記録します。手続き、関数、およびメソッドに対しては、コンパイラは実装の場所を記録します。これにより、コード エディタでの参照が可能になります。
-
参照情報($Y+)オプション: Delphi コンパイラは、各識別子が定義されている場所だけでなく、それらが使用されている場所についての情報も記録します。これにより、プロジェクト ブラウザの参照ページが使用可能になります。
これらのコンパイラ オプションは、デバッグ情報(
$D
)オプションと、ローカル デバッグ シンボル(
$L
)オプションの両方がオンの場合にのみ利用できます。
WebSnap ディレクトリの指定
C++Builder を WebSnap と一緒に使用している場合は、実行可能ファイルが HTML ファイルと同じディレクトリに書き込まれることを確認してください。実行可能ファイルがプロジェクト ディレクトリに書き込まれるようにするには、 [プロジェクト|オプション...|パスとシンボル定義|最終出力]
にドット(".")を入力します。
プリコンパイル済みヘッダーの場所の変更
C++ のプリコンパイル済みヘッダー ファイル(PCH)は、BDS2006 とは異なるファイル格納場所に保存されます。BDS2006 からプロジェクトをインポートした場合、本製品はプロジェクトの PCH ファイル格納場所をインポートしません。 [プロジェクト|オプション...|C++コンパイラ|プリコンパイル済みヘッダー|PCH ファイル名]
で PCH ファイルを設定できます。
Delphi コンパイラから C++ ファイルを生成
.pas ファイルから .hpp ファイル(対応する .obj を含む)を生成する場合は、dcc32.exe で -JPHNE スイッチを指定する必要があります。あるいは、.pas ファイルを含む .dpk ファイルで -JL スイッチを使用します。
C++ コンパイラが厳密になりました
C++Builder 2007 と一緒に出荷される C++ コンパイラは、旧バージョンより厳密になりました。旧バージョンの C++Builder ではエラーが発生しなかったコードが、C++Builder 2007 ではコンパイル エラーになる場合があります。ここでは、コンパイラが厳密になった一般的な分野をいくつか列挙します。ケースごとに、問題が発生する例と、 C++Builder 2007 でコンパイルするためのコードの更新方法を示します。ただし、問題のあるコードの更新方法は、通常は複数あります。どの方法が適切かは、元のコードの目的によって異なります。
キャストと参照
旧バージョンの Borland C++ コンパイラでは、引数の型が参照パラメータとして期待される型と一致しない場合は、キャストが許されていました。次に例を示します。
int takesLongRef(long& l);
int takesUnsignedPtr(unsigned long* psize) { return takesLongRef((long)*psize);
}
C++Builder2007 では、上のコードは次のコンパイル エラーになります。
[BCC32 エラー] test.cpp(3): E2357 参照は 'long' で初期化されているが 'long' 型の左辺値が必要
[BCC32 エラー] test.cpp(3): E2342 パラメータ 'l' は long & 型として定義されているので long は渡せない
これを解決するには、次のように、逆参照する前に psize をキャストします。
int takesLongRef(long& l);
int takesUnsignedPtr(unsigned long* psize) { return takesLongRef(*reinterpret_cast<long*>(psize));
}
警告: -Vb(下位互換)スイッチを有効にすると、元のコードをコンパイルできます。ただし、コンパイラは、*psize ではなく、一時変数を takesLongRef に渡します。このため、意図しない結果が生じる可能性があります。
一時変数と参照
旧バージョンの C++ コンパイラでは、参照が期待されている場所ならどこでも、一時変数を使用することが許されていました。次に例を示します。
#include <vcl.h>
class TTest { WideString FData ;
public: __property WideString Data = {read = FData };
};
void Func(WideString& wref);
void test() { TTest t;
Func(t.Data); }
C++Builder 2007 では、上のコードは次のコンパイル エラーになります。
[BCC32 エラー] test.cpp(14): E2357 参照は 'const WideString' で初期化されているが 'WideString' 型の左辺値が必要
[BCC32 エラー] test.cpp(14): E2342 パラメータ 'wref' は WideString & 型として定義されているので WideString は渡せない
これを解決するには、次のように参照を const 参照に変更します。
void Func(const WideString& wref);
調停エラー ダイアログ
一時変数と参照の問題は、旧バージョンの 調停エラー ダイアログ ウィザードで生成されたコードで発生します。これを解決するには、VarToAnsiStr メソッドを探します。
AnsiString VarToAnsiStr (Variant &V, TFieldType DataType)
これを、次のように const Variant& を取るように変更します。
AnsiString VarToAnsiStr (const Variant &V, TFieldType DataType)
あいまい性
C++Builder 2007 コンパイラが旧バージョンから最も大きく変わった分野は、あいまい性の検出です。以前は許されていた部分が、あいまいであると報告され、その意図を明確にするために修正を求められます。以降のセクションでは、あいまいであると報告されるいくつかのケースを紹介します。
ユーザー定義演算子による変換
新しい C++Builder 2007 コンパイラでは、ユーザー定義演算子を含む変換に対して、あいまい性が報告されることがしばしばあります。次に例を示します。
class AnsiString
{ public:
bool operator ==(const AnsiString& other); AnsiString(const wchar_t* src);
};
class Variant {
public: operator AnsiString() const;
operator wchar_t*() const; bool operator ==(const AnsiString& rhs) const
{ return static_cast<AnsiString>(*this) == rhs;} };
C++Builder ユーザーは、上の例が、VCL の AnsiString クラスと Variant クラスを移植したバージョンであることに気付いたかもしれません。旧バージョンのコンパイラは、 'static_cast<AnsiString>(*this)' に対して Variant' 'operator AnsiString() const' を呼び出しました。一方、C++Builder 2007 は、コンストラクタによる変換を使用します。Variant は、AnsiString コンストラクタに対応する複数の型に変換されるので、コンパイラはあいまい性エラーを出力します。
このエラーを解決するには、次の部分のキャストを除去する必要があります。
bool operator ==(const AnsiString& rhs) const
{ return (*this) == rhs;}
これによって、演算子も明確にすることができます。
bool operator ==(const AnsiString& rhs) const
{ return this->operator AnsiString() == rhs; }
Variant/OleVariant/AnsiString/WideString/TDateTime
上で説明したユーザー定義の変換演算子とコンストラクタによる変換の違いによる問題は、VCL クラスの Variant、OleVariant、AnsiString、WideString、TDateTime、Currency などを含む構成要素で発生する場合があります。次の表に、エラーメッセージが生成される構成要素と、その更新後の構文を示します。
| 更新前の構文 |
更新後の構文 |
メモ |
AnsiString test(OleVariant v) { AnsiString ret = (AnsiString) v; return ret; } |
AnsiString test(OleVariant v) { AnsiString ret = /*(AnsiString)*/ v; return ret; } |
代入の中で変換演算子を使用している場合は、RHS のキャストを外します。
|
WideString test(OleVariant v) { WideString w(v); return w; } |
WideString test(OleVariant v) { WideString w = v; return w; }
|
直接的なコンストラクタの代わりに、コピーによる初期化を使用します。 |
std::abs() Ambiguity
標準の abs 関数でもあいまい性エラーが発生する場合があります。それは、さまざまなオーバーロード バージョンの abs が要求する型と正確に一致しないパラメータが渡された場合です。次に例を示します。
#include <limits>
bool test(long l) { return std::abs(l) > 0;
}
このコードでは、次のコンパイル エラーが出力されます。
[BCC32 エラー] test.cpp(5): E2015 'std::abs(int) at C:\dev\tp\sc\include\math.h:208' と 'std::abs(long double) at C:\dev\tp\sc\include\math.h:275' の区別が曖昧
[BCC32 警告] test.cpp(6): W8057 パラメータ 'l' は一度も使用されない
これを解決するには、呼び出したいオーバーロード型にキャストします。次に例を示します。
#include <limits>
bool test(long l) { return std::abs(static_cast<int>(l)) > 0;
}
先頭へ