7

プロジェクトがライブラリであるかどうかを知りたいのですが、ヘルプを読んだ後、このコードは機能しません:

{$IF DEFINED(LIBPREFIX)}
    {$DEFINE PROJECT_IS_EXECUTABLE}
    {$UNDEF PROJECT_IS_LIBRARY}
{$ELSE}
    {$DEFINE PROJECT_IS_EXECUTABLE}
    {$UNDEF PROJECT_IS_LIBRARY}
{$IFEND}

DEFINED、DECLARED、および

{$IF (LIBPREFIX = '')}

すべての試行は、DLL とプログラムに対して常に同じ結果を返します。組み込みのコンパイラ ディレクティブのみを使用してこれを行うにはどうすればよいですか?

編集

私の意図は、「PE ファイル」から余分な情報を削除することです。

.dpr プロジェクト ファイルで直接行うので、他のユニットがどのようにコンパイルされたとしても、DLL プロジェクトで同じことを行うことはできません。

したがって、DLL プロジェクトでそれをブロックする方法を探していました。

これが私がこの問題を解決した方法です。このディレクティブを .dpr プログラムに追加します。

  {$DEFINE STRIPE_PE_INFO}
  {$DEFINE STRIPE_RTTI}
  {$I DDC_STRIP.inc}

そして、DDC_STRIP.inc にはすべてのロジックがあります。

4

3 に答える 3

11

ファイルがコンパイルされているときにこれを知る方法はありません。ソース ファイルを .dcu にコンパイルしてから、任意のタイプのプロジェクトにリンクできます。良い例は、RTL ユニットと VCL ユニットです。

おそらく最善の方法は、プロジェクト オプションで、プロジェクトがライブラリであるかどうかを示す条件を定義することです。ただし、このユニットを使用するプロジェクトをビルドするときは、.dcu が常に再コンパイルされるようにする必要があります。

于 2012-10-28T19:49:29.787 に答える
6

これはコンパイル時に判断できませんが、実行時にSysInit.ModuleIsLib(Delphi 2007)をチェックして、コードがライブラリ(またはパッケージ)で実行されているかどうかを判断できます。

于 2012-10-28T20:25:25.173 に答える
1

私が考えることができる最善の方法は、インクルード ファイルに定義を設定することです。ビルド前のアクション (bat ファイル) を使用して、インクルード ファイルを変更できます。

于 2012-10-28T20:21:57.587 に答える