Dynamic Linkable Library詳細説明


大きなアプリケーションは多くのモジュールで構成されています。これらのモジュールはそれぞれ独立した機能を実現しています。いくつかのモジュールの機能が一般的であり、他のソフトウェアシステムを構築する際にも使用される場合があります。ソフトウェアシステムを構築する時、すべてのモジュールのソースコードをアプリケーションEXEファイル全体に静的にコンパイルすると、いくつかの問題が発生します。一つの欠点は、アプリケーションのサイズを増加させ、より多くのディスク空間を占有します。プログラム実行時にも大きなメモリ空間を消費し、システムリソースの浪費をもたらします。もう一つの欠点は、大きなEXEプログラムを作成する時、再建を修正するたびに、すべてのソースコードをコンパイルしなければなりません。コンパイルプロセスの複雑さを増やして、段階的なユニットテストにも役立ちません。Windowsシステムプラットフォームでは、完全に異なる効率的なプログラミングと実行環境を提供しています。独立したプログラムモジュールを小さなDLLファイルとして作成し、それらを個別にコンパイルしてテストすることができます。実行時には、EXEプログラムがこれらのDLLモジュールを呼び出す場合にのみ、システムはメモリ空間にそれらを搭載することができます。この方式は、EXEファイルのサイズとメモリ空間に対するニーズを低減するだけでなく、これらDLLモジュールを複数のアプリケーションに同時に使用することができる。Windows自身はいくつかの主要なシステム機能をDLLモジュールとして実現している。DLLは、一般的には、DLl、DRV、.FON、.SYSと、多くの拡張子としてのシステムファイルであり、DLLとすることができるディスクファイルである。グローバルデータ、サービス関数、リソースから構成され、実行時に起動プロセスの仮想空間にシステムでロードされ、起動プロセスの一部となる。他のDLLとの間に競合がない場合、このファイルは通常、プロセス仮想空間の同じアドレスにマッピングされる。DLLモジュールには、外部にサービスを提供するための様々な導出関数が含まれている。DLLは自分のデータセグメントを持つことができますが、自分のスタックがなく、それを呼び出すアプリケーションと同じスタックモードを使用します。DLLはメモリの中に一つの例しかない。DLLはコードパッケージ性を実現した。DLLの作成は、具体的なプログラミング言語およびコンパイラとは無関係である。Win 32環境では、各プロセスは自分の読み/書きのグローバル変数をコピーします。他のプロセスとメモリを共有するには、メモリマップファイルを使用するか、共有データセグメントを宣言する必要があります。DLLモジュールに必要なスタックメモリは、すべて実行プロセスのスタックから割り当てられている。Windowsは、DLLモジュールをロードする際に、プロセス関数をDLLファイルの導出関数と一致させる。WindowsオペレーティングシステムのDLLに対する操作は、DLLを必要とするプロセスの仮想アドレス空間にマッピングするだけである。DLL関数のコードによって作成されたオブジェクト(変数を含む)は、スレッドまたはプロセスのすべてに帰属します。コール方式:1、静的呼び出し方式:DLLへのロードとアプリケーションの終了時にDLLをコンパイルしたエンコーディング(DLLを使用する他のプログラムがある場合、WindowsのDLLへのアプリケーション記録は1を減算し、すべての関連プログラムが終了するまでDLLの使用を解除します。簡単で実用的ですが、柔軟性が足りないので、一般的な要求を満たすしかないです。暗黙的な呼び出し:ダイナミックライブラリが生成されたときに発生するLIBファイルをアプリケーションのプロジェクトに組み込む必要があります。DLLの関数を使用したい場合は、説明してください。暗黙的な呼び出しは、LoadLibrary()とFree Library()を呼び出す必要がありません。プログラマがDLLファイルを作成すると、リンクプログラムは自動的に対応するLIBインポートファイルを生成します。このファイルは、各DLL導出関数のシンボル名と任意の識別番号を含んでいるが、実際のコードは含まれていない。LIBファイルはDLLの代替ファイルとしてアプリケーションプロジェクトにコンパイルされる。プログラマが静的リンク方式でアプリケーションをコンパイルして生成すると、アプリケーション内の呼び出し関数はLIBファイルから導出されたシンボルと一致し、これらのシンボルまたは識別番号は生成されたEXEファイルに入る。LIBファイルには対応するDL Lファイル名(ただし、完全なパス名ではない)も含まれており、リンクプログラムはEXEファイル内部に格納される。アプリケーションの実行中にDLLファイルをロードする必要がある場合、Windowsは、これらの情報に基づいてDLLを発見してロードし、その後、シンボル名または識別番号を介してDLL関数への動的なリンクを実現する。アプリケーションで起動されたDLLファイルはすべて、アプリケーションEXEファイルのロード時にメモリにロードされます。プログラムは、DLL出力関数情報を含む入力ライブラリファイル(.LIBファイル)にリンクすることができます。オペレーティングシステムは、実行可能なプログラムをロードする際にDLLをロードする。実行可能プログラムは、直接に関数名を介してDLLの出力関数を呼び出します。呼び出し方法は、プログラム内部の他の関数と同じです。2、動的な呼び出し方式:プログラミング者がAPI関数でDLLをロードし、アンインストールしてDLLを呼び出す目的を達成し、使用はより複雑であるが、メモリをより効果的に使用することができ、大きなアプリケーションを作成する時の重要な方法である。明示的な呼び出しとは、アプリケーションにおいてLoadLibraryまたはMFCで提供されるAfxLoadLibrary明示的に自分のした動的な接続ライブラリを呼び出し、動的な接続ライブラリのファイル名は上記の2つの関数のパラメータであり、GetProcAddres()で導入したい関数を取得することです。このとき、この導入関数は、このアプリケーションがカスタマイズした関数と同じように呼び出すことができます。アプリケーションが終了する前に、Free LibraryまたはMFCから提供されるAfxFree Libraryで動的な接続ライブラリを解放するべきである。Win 32のLoadLibary関数を直接呼び出して、DLLのパスをパラメータとして指定します。LoadLibaryはHINSTANCEパラメータに戻り、アプリケーションはGetProcAddress関数を呼び出すときにこのパラメータを使用します。Get ProcAddres関数は、シンボル名または識別番号をDLL内部のアドレスに変換する。プログラマは、DLLファイルがいつロードされるか、またはロードされないかを決定し、明示的リンクは、実行中にどのDLLファイルをロードするかを決定することができる。DLLを使用するプログラムは、DLLをローディングしてDLLモジュールのハンドルを得る必要があります。その後、Get ProcAddress関数を呼び出して出力関数のポインタを得て、ログアウトする前にDLLをアンインストールしなければなりません。DLLはメモリを占有するのが小さいだけに、編集しやすいなどの特徴があります。多くのコンピューターウイルスはDLL形式のファイルです。ただし、単独で運転することはできません。ダイナミックリンクライブラリは、通常、直接実行できず、メッセージも受信できない。これらはいくつかの独立したファイルであり、実行可能なプログラムまたは他のDLLによって呼び出しられて、ある仕事を完了することができる関数を含む。他のモジュールで動的リンクライブラリの関数を呼び出した場合にのみ機能します。