4

私が書いているコンポーネントに、登録された画像フォーマットの自動検出を含めたいのですが、それはUse Debug DCU's compiler オプションが無効になっている場合にのみ機能するソリューションです。

私が本当に知りたいのは、コンパイラ オプションの依存関係を含まないこのソリューションの代替手段です。

しかし当面は、Use Debug DCU'sコンパイラ オプションが設定されているかどうかを実行時に確認する方法を知りたいだけです。

4

2 に答える 2

5

実行時にその情報を取得する信頼できる方法はありません

コンパイラ オプションはUse Debug DCUs検索パスのみを切り替えます。コンパイラが最終的に何を見つけるかは不明です。(見当違いの) ユーザーがリリース DCU をデバッグ ディレクトリにコピーしたか、またはその逆の可能性があります。

誤ったユーザーがいなくても、バグ修正を含めるために、プロジェクトにいくつかのファイルを追加 (およびプロジェクトと共にコンパイル) する場合があります。たとえば、ユーザーがGraphics.pasプロジェクトに を追加し、リリース/非デバッグ ビルドを実行するが、Use Debug DCU'sコンパイラ オプションを保持する場合、Graphics.dcu実際にリンクされている はデバッグ ビルドではありません。これは、実行可能ファイルで再ビルドされるためです。したがって、デバッグ dcus と非デバッグ dcus の「混合」バッグが得られます。

特定のオブジェクトまたはメソッドに関連するデバッグ情報の存在を検出しようとすることもできますが、これも信頼できません。「Build with Debug Dcus」を使用してから「Debug Information」を false に設定すると、基本的に、デバッグ情報を探すことができないようにします。

しかし、そのリンクされたコードはデバッグ DCU で失敗します

GLScene プロジェクトのコードは適切なハックではありません。ハードコードされたオフセットを のコードにTPicture.RegisterFileFormat使用し、ハードコードされたオフセットを引き続き使用してグローバル変数のアドレスを取得します (ルーチンFileFormatsを呼び出しません)。GetFileFormatsマジックナンバーが多すぎます!

私の最初の方法は、メソッドをTList使用して特定されたものと私が特定したものを比較することでしたが、私のマシンでは問題はなく、両方の状況で両方のルーチンが同じ結果になりました。私のマシンでは、醜いですが、デバッグ DCU で壊れていません。GLSceneTListGLScene

いくつかの rtl/vcl ユニット (SysUtils、Graphics、Classes) の「フィンガープリント」も試しました。すべてのパブリック クラスのリストを作成し、各クラスのメソッドごとに RTTI を使用するコードを生成し、コードの最初の 1024 バイトを文字列ファイルにダンプします。そのプログラムをデバッグ DCU と非デバッグ DCU で実行したところ、同じ結果が得られました。テキスト ファイルには、約 3500 のメソッドのフィンガープリントが含まれています。

良い考えではない

このオプションはコンパイラのコンパイル方法には実際には影響しない (リンカーがリンクするもののみ) ため、このオプションに依存するコードを作成することは非常に信頼性が低く、良い考えではありません。これは低レベルのハッキングにのみ影響し、絶対に制御できない状況でアプリケーションをクラッシュさせる可能性のある低レベルのハックは望ましくありません。

唯一の真の選択肢は、失敗する可能性のあるハックを、失敗しない (または少なくとも制御可能な方法で失敗する) ハックに置き換えることです。

于 2013-02-03T20:59:44.100 に答える
2

Ken がコメントしているように、このコンパイラ オプションが関与するパスの変更を検出する方法はおそらくないでしょう。コマンド ライン コンパイラのドキュメントでは、コンパイラ スイッチについて言及されていないため、単に存在しないことを意味します。コンパイラ スイッチがないと、そのコンパイラ オプションが設定されているかどうかを確認できません。


...しかし、 Use Debug DCU's compiler オプションが無効になっている場合にのみ機能するソリューションです。

機能する場合のみ、それ以外の場合は例外が発生することを意味する場合は、次の代替手段を使用できます。

try
  // AutoDetectRegisteredImageFormats
except
  // Handle case when Use Debug DCU's is on
end;
于 2013-02-03T19:21:16.313 に答える