2

これは別のDelphiバージョンの質問に関連していますが、それでも異なります。

コードをコンパイルしているDelphiコンパイラのサービスパック(またはビルド番号)を検出する方法を探しています。jedi.incは素晴らしいですが、正確なバージョンはわかりません。(SUPPORTS_ *の定義もバージョンに関連しているため、そこでは使用できません)

古いバージョン(この場合はDelphi 2009の_ValLongバグ)にいくつかのバグがあり、後のサービスパック(この場合はDelphi 2009サービスパック3)で修正されているため、これが必要です。

現在、コードには次のようなあらゆる種類のチェックがあります。

{$ IFDEF BUG_QC_68123}

しかし、メインのインクルードファイルでこれを言うことはできません:

{$IFDEF DELPHI2009_UP}
  {$DEFINE BUG_QC_68123}
{$ENDIF}

...これは、D2009SP3以降にこのバグがないという事実を見逃してしまうためです。

何か案は?

PS:これはおそらく古い(そして新しい)バージョンのDelphiにも当てはまるので、ライブラリやコンポーネントのベンダーなら誰でもこれに関心があると思います。

4

4 に答える 4

5

バージョンごとに定義された記号があります。

VER80 - Delphi 1
VER90 - Delphi 2
VER100 - Delphi 3
VER120 - Delphi 4
VER130 - Delphi 5
VER140 - Delphi 6
VER150 - Delphi 7
VER160 - Delphi 8
VER170 - Delphi 2005
VER180 - Delphi 2006
VER180 - Delphi 2007
VER185 - Delphi 2007 (Note: symbol VER185, for example, is used to indicate Delphi 2007 compiler or an earlier version.)
VER190 - Delphi 2007 for .NET
VER200 - C++ Builder 2009
VER210 - Delphi 2010
VER220 - Delphi XE
VER230 - Delphi XE2
VER240 - Delphi XE3
VER250 - Delphi XE4
VER260 - Delphi XE5
VER270 - Delphi XE6
VER280 - Delphi XE7
WIN32 - Indicates that the operating environment is the Win32 API.
LINUX - Indicates that the operating environment is Linux
MSWINDOWS - Indicates that the operating environment is the MS Windows/li] 
CONSOLE - Indicates that an application is being compiled as a console application

ソース 別のソース 異なるビルド番号を確認することはできません。

そして好奇心旺盛な人のために、ターボパスカルバージョンのVER10-VER70とVER110はC++ビルダーバージョンでした。

于 2009-07-09T13:26:51.723 に答える
3

残念ながら、System.pasのRTLVersionのような定数は更新で更新されませんが、誰かがQCエントリを作成したい場合は良い提案になると思います。

テストしているバグがコードで再現するのが実用的である場合は、起動時にいつでもバグをテストして、独自のグローバルフラグを設定できます。

これらの違いを回避するには、常に最新の更新を適用するようにします。更新が不安定で、ロールバックを余儀なくされたケースにはまだ遭遇していません。少なくともDelphiではそうではありません。

于 2009-07-09T13:24:17.560 に答える
1

コンパイラはその情報を公開しません。更新プログラムが適用されても変更されないメジャー バージョンのみが表示されます。

あなたができる最善のことは、常に最新のアップデート用のコードを書くことだと思います。コードのコンシューマーも最新の更新プログラムを持っていると仮定します。そうでない場合、それは彼ら自身のせいであり、あなたが心配する必要のある問題ではありません. システム要件に記載してください。確かに、あなたのコードは彼らのためには機能しませんが、彼らはまだ既知の悪いコードを使用しているため、他の人もそうではありません.

次善の策は、更新が適用されていないと仮定して書き込むことです。つまり、すべての既知のバグがまだ存在するかのようにコードを記述してください。欠点は、コードが通常どおりに実行されない可能性が高いことです。そのため、アップグレードによって正しいことを行ったすべての人が、最適化されていないコードを使い続けることで罰せられます。

于 2009-07-09T13:45:30.437 に答える
1

ソフトウェアにコンパイラ ファイルのバージョンを含めてみてください。たとえば、DCC32.exe にはファイル バージョンがあり、プログラムで取得して、ユニットに const として書き込むことができます。これはビルド プロセスの一部として実行できるため、アプリをビルドする前にバージョン情報を取得できます ( FinalBuilderなどを使用すると非常に簡単に実行できます)。

これは、About 画面でさまざまな有用な情報を取得できるようにするためです。また、アプリケーションにエラーが発生した場合は、この情報を EurekaLog バグ レポートにまとめることができます。

ただし、DCC32.exe のファイル バージョンが Delphi の更新ごとに更新されるかどうかはわかりません。

于 2009-07-09T13:56:25.603 に答える