最近、私はDelphiの作業を開始し、多くのパッケージが元のプログラムで使用されていることがわかりましたが、私は常に無知な状態にありました。この問題を研究するのに時間がかかるかもしれません。したがって、分析する必要がある質問を最初にリストします。
バッグとは何ですか? exeとは何ですか?それらの構成の違いは何ですか?パッケージとDCUの関係は何ですか? DCPは何をしますか?コンパイル時にこれらのファイルとの関係は何ですか?どのようにロードされていますか?読み込み後にパッケージを操作する方法は? DLLはエクスポートできますが、なぜDelphiはパッケージのエクスポートを持ち出すのに役立たないのですか?
まず、Delphiの編集プロセスを見てみましょう。 Delphiには2つのタイプのプロジェクトがあります。前者にはサフィックスDPKがあり、後者はDPRです。簡単なものから始めて、DPRから始めましょう。 Delphiのヘルプ文書によると、典型的なDPRファイルの構造は次のとおりです。
1プログラムエディター。
2
3使用
4つのフォーム、{Linuxのqformsに変更}
5 reabout.pas '{aboutbox}での再び
6は 'remain.pas' {mainform}に残ります。
7
8 {$ r *.res}
9
10開始
11 Application.Title:= 'Text Editor';
12 application.createform(tmainform、mainform);
13 Application.run;
14エンド。
その中でも、10〜14行、開始…終了は、当然プログラムの実行入り口です。使用部品は、プログラムが使用する必要があるユニットを示しています。必要?その後、各ユニットは他のユニットを使用し、この問題はますます複雑になっているようです。最初にソースコード全体の構造を見てみましょう。
コンパイラの最初のステップは、この指示されたグラフを通過し、必要に応じて各ユニットをコンパイルし、対応するDCUを生成することだと思います。この「必要な」問題に関しては、私は当初、ユニットの使用声明があると思っていましたが、後でそれが間違っていることがわかりました。上記の場合、Unit3はUnit1の使用句のパスを指定していませんが、対応するDCUファイルはまだ正しく生成されます。後でファイルを使用してファイルの開く状況を監視し、発見プロセスは次のとおりです。グラフ内の各ノードについて、コンパイラは現在のディレクトリの検索パスで対応するノードを検索します - プロジェクト属性 - ライブラリのライブラリパス環境。PASファイルが見つからない場合は、今回はノードに対応するDCUファイルを検索しました。
コンパイルが完了したので、各ユニット(つまり、PASファイル)がDCUファイルを生成しました。接続に関しては、問題は複雑です。静的接続とは、これらすべてのDCUを結合することを意味します。このようにして、あるユニットの別のユニットへの呼び出しは、プログラムの内部問題になります。この利点は、それが高速でシンプルであり、同時共有などの問題は簡単に対処できることです。欠点は、ターゲットプログラムが大きく、別のプログラムが現在記述され、Unit3を再利用できる場合、接続時にUnit3.DCUが再度コピーされることです。このようにして、2つのプログラムが同時に実行されると、メモリに2つのUnit3のコピーがあります。これは無駄です。動的接続とは、2つのプログラムが接続する場合、Unit3への参照のみを保持し、Unit3のコンテンツをコピーしないことを意味します。実行時に、Unit3をメモリにロードし、2つのプログラムを一般的にします。 DLLとBPLはどちらも動的接続のソリューションです。問題は、Delphiの接続の唯一のオプションがプロジェクト|オプション|パッケージメニューに表示され、「ランタイムパッケージでビルド」という文が本当にあいまいであることです。したがって、もう一度勉強する必要があります。
プログラムが実行されると、ビュー|デバッグウィンドウ| moudlesを使用して、メモリにロードされたものとそれらに含まれるコンテンツを確認できます。
簡単にするために、次の構造でプログラムを設定します。
プログラムProjectExe;
用途
フォーム、
窓、
'unitformmain.pas' {formmain}のunitformmain;
{$ r *.res}
始める
Application.Initialize;
application.createform(tformmain、formmain);
application.run;
終わり。
ユニットUnitformmain;
インタフェース
用途
Windows、stdctrls、forms、unitformanother、classes、controls;
タイプ
tformmain = class(tform)
Button1:Tbutton;
手順button1click(sender:tobject);
プライベート
{プライベート宣言}
公共
{公開宣言}
終わり;
var
Formmain:tformmain;
実装
{$ r *.dfm}
手順tformmain.button1click(sender:tobject);
var
lform:tformanother;
始める
lform:= tformanother.create(application);
lform.showmodal;
lform.free;
終わり;
終わり。
ユニットユニットフォーマン他。
インタフェース
用途
フォーム;
タイプ
tformanother = class(tform)
プライベート
{プライベート宣言}
公共
{公開宣言}
終わり;
実装
{$ r *.dfm}
終わり。
今すぐニュースを見てみましょう。 「ランタイムパッケージを使用したビルド」がチェックされているため、ランタイムProjectexe.exeファイルには4つの部分、1つのsysinit.pas、および1つのprojectexe.dprが含まれていることがわかりますプロセスツリー:RTL60およびVCL60では、それらのコンテンツは、今すぐ静的接続に表示されたユニットです。 ProjectExe.exeは現在16Kです。言い換えれば、指示されたグラフのユニットの一部がexeに配置され、他の部分はBPLに配置されます。しかし、部門は何に基づいていますか?使用節に基づいていますか、それともここに「ランタイムパッケージを使用してビルド」のリストに基づいていますか?テストを継続すると、リストにVCL60のみが含まれている場合、メモリにロードされた2つのBPLと1つのExeがメモリにロードされることがわかりました。 EXEが変更されました。内部のユニットの数が増加し、基本的にVCL60パッケージに載っています。 RTLパッケージとVCLパッケージの間には要件関係があるはずです。これは次のステップでテストされます。ただし、最初の推定プロセス中に、パッケージリストは間違いなく、EXEからパッケージに既に存在するユニットを除外するために使用されます。
動的接続の後、別の問題があります:読み込み。自動とも呼ばれる静的な戦略があり、Delphiからコードを生成し、他方がexe、つまりプログラムが実行されているとき、パッケージを指定してロードする前にパッケージを自動的にロードします。それ。問題は、どのような状況で、Delphiがパッケージを自動的にロードするのか、どのような状況でも、Delphiがスマートであることを避けて、パッケージを柔軟に使用できるようにする必要があることです。前の実験では、DPRファイルが実行される前に、静的に接続されたパッケージがメモリにロードされていることのみがわかります。特定のプロセスはわかりません。次の章が自分のパッケージを書き始めてから実験を行います。