20

Delphi(または、もちろん存在する場合は一般的なツール)を使用して、exeファイルのサイズを縮小し、使用されていないがそこに存在するすべてのコードを削除することは可能ですか?
(たとえば、存在するが呼び出されない関数またはプロシージャ)。
Pascal では、ユニット (オブジェクトなし) を使用して、コンパイラは実際に使用されるプロシージャと関数のみを含め、ユニット内の未使用のルーチンを最終的な exe から削除することを覚えています。

Object-pascal では、Delphi 1 ではオブジェクトのすべてのメンバーが exe に含まれていたことを覚えています。
Delphi-XE2 までと比べて、何か変わったことはありますか?

4

5 に答える 5

8

アプリケーションの EXE サイズを縮小する- 優れた記事

(上記リンクより引用)

通常、Delphi で作成された EXE ファイルは、別のプログラミング言語で作成された EXE ファイルよりもサイズが大きくなります。その理由は VCL です。(確かに、VCL には多くの利点があります...)

EXE のサイズを縮小するには、いくつかの方法があります。

01) EXE-Packer (UPX, ASPack,...) を使用 - UPX

02) KOL を使用する。

03) VCL なしでアプリケーションを作成する

04) ACL (API コントロール ライブラリ) を使用する

05) StripReloc を使用します。

06) リモートデバッグ情報と TD32 を無効にします。

07) コードを dll に入れたいと思うかもしれません。

08) フォームに同じ画像を複数配置しないでください。実行時にロードします。

09) 圧縮画像を使用する (BMP ではなく JPG)

10) DFM ファイルに保存するプロパティを減らす

于 2011-09-13T09:12:05.500 に答える
1

他の人が書いたものを補足するだけです...

スマート リンカは、次の条件を除き、未使用のルーチンを削除します。

  • ユニットにはinitializationセクションがあります - 残念ながら、RTL/VCL の最大のユニット (クラス、SysUtils、Windows、フォームなど) の多くには初期化セクションがあるため、それらがuses句に含まれている場合は、enchilada 全体がリンクされます。あなたのコード。RTL/VCL のコードの多くは、これを削減または排除するためにリファクタリングできますが、下位互換性が失われます。

  • ルーチンはクラスの一部であり、仮想または動的としてマークされています-仮想または動的メソッドを含むコードでインスタンス化してオブジェクト化する場合、それらのメソッドは、呼び出すかどうかに関係なく、実行可能ファイルにリンクされます。

exeファイルのサイズを縮小するために実行できる追加の手順:

  • フォームの継承を利用する - 類似したフォームが多数ある場合は、継承元のベース フォームを作成します。これらの子フォームは、基本フォームとは異なるプロパティのみを dfm に保存します。これにより、dfms 内の冗長な情報が排除され、実行可能ファイルのサイズが大幅に縮小されます。

  • 大きなグラフィックスを外部ファイルに保存し、必要に応じてロードします。スプラッシュ スクリーン、「スキン」、アイコン セットなどは、exe ファイルのサイズを実際に肥大化させる可能性があります。これらのファイルが exe に埋め込まれている場合、Delphi はこれらのファイルを常に最も効率的な形式で保存するとは限りません。

  • コンパイル後にexeから特定の未使用のデータを削除することにより、exeのサイズを10%から30%削減できます。これを行うことができるサード パーティ製のツールがありますが、適切な PE ヘッダーフラグを設定することで、いくつかの問題を解消できます。一部のフラグはexeを使用できなくする可能性があるため、使用する前に各フラグの意味を理解していることを確認してください。

  • RTL/VLC の一部を独自のユニットにコピーします。クラスまたは SysUtils を uses 句に含める代わりに、新しいユニットを作成し、必要なクラスと関数だけをユニットにコピーします。次に、代わりに使用します。

  • コードをロード可能なモジュールに分割する - 同じユニットを再利用する exe が複数ある場合は、すべてを exe に静的にリンクするのではなく、dll または bpl を使用してそれらを小さくすることができます。dll/bpl は、それを必要とする exe の数に関係なく、一度だけメモリにロードされます。

于 2011-11-18T19:00:10.020 に答える