ホームページ >よくある問題 >dllのファイル形式は何ですか?

dllのファイル形式は何ですか?

藏色散人
藏色散人オリジナル
2020-02-15 09:51:0124913ブラウズ

dllのファイル形式は何ですか?

dll のファイル形式は何ですか?

DLL ファイル (ダイナミック リンク可能ライブラリ) は、単独では実行できないファイルです。特別なタスクを実行するためにプログラムがコードやその他のリソースを共有できるようにします

比較的大規模なアプリケーションが構成されていますこれらのモジュールは比較的独立した機能を実現し、相互に連携してソフトウェア システム全体の作業を完了します。機能がより一般的で、他のソフトウェア システムを構築するときに引き続き使用されるモジュールがいくつかある場合があります。ソフトウェア システムを構築する場合、すべてのモジュールのソース コードがアプリケーション EXE ファイル全体に静的にコンパイルされると、いくつかの問題が発生します。欠点の 1 つは、アプリケーションのサイズが増大し、より多くのディスク領域を占有し、プログラムが実行されることです。また、大量のメモリ空間を消費し、システム リソースの浪費を引き起こします。もう 1 つの欠点は、大規模な EXE プログラムを作成する場合、変更および再構築されるたびにすべてのソース コードを調整してコンパイルする必要があり、その結果、プログラムの複雑さが増大することです。コンパイル プロセスも、段階的な単体テストには役に立ちません。

Windows システム プラットフォームは、まったく異なる、より効果的なプログラミングおよび実行環境を提供します。独立したプログラム モジュールを小さな DLL ファイルとして作成し、個別にコンパイルおよびテストできます。実行時に、システムは、EXE プログラムが実際に DLL モジュールを呼び出したい場合にのみ、これらの DLL モジュールをメモリ空間にロードします。このアプローチにより、EXE ファイルのサイズと必要なメモリ容量が削減されるだけでなく、これらの DLL モジュールを複数のアプリケーションで同時に使用できるようになります。 Windows 自体は、いくつかの主要なシステム機能を DLL モジュールの形式で実装しています。

一般的に、DLL はディスク ファイルです。.dll、.DRV、.FON、.SYS および多くの .EXE 拡張子を持つシステム ファイルも DLL になる可能性があります。これはグローバル データ、サービス関数、およびリソースで構成され、実行時にシステムによって呼び出しプロセスの仮想空間にロードされ、呼び出しプロセスの一部になります。他の DLL と競合がない場合、ファイルは通常、プロセスの仮想空間内の同じアドレスにマップされます。 DLL モジュールには、外部にサービスを提供するためのさまざまなエクスポート関数が含まれています。 DLL は独自のデータ セグメントを持つことができますが、独自のスタックは持たず、それを呼び出すアプリケーションと同じスタック モードを使用します。DLL はメモリ内にインスタンスを 1 つだけ持ちます。DLL はコードのカプセル化を実装します。DLL の準備特定のプログラミング言語に関連していますが、コンパイラとは何の関係もありません。

Win32 環境では、各プロセスが独自の読み取り/書き込みグローバル変数をコピーします。他のプロセスとメモリを共有したい場合は、メモリ マップト ファイルを使用するか、共有データ セグメントを宣言する必要があります。 DLL モジュールに必要なスタック メモリは、実行中のプロセスのスタックから割り当てられます。 Windows は、DLL モジュールを読み込むときに、プロセス関数呼び出しを DLL ファイルのエクスポートされた関数と照合します。 DLL に対する Windows オペレーティング システムの操作は、DLL をそれを必要とするプロセスの仮想アドレス空間にマップすることだけです。 DLL 関数内のコードによって作成されたオブジェクト (変数を含む) は、それを呼び出すスレッドまたはプロセスによって所有されます。

呼び出しメソッド:

1. 静的呼び出しメソッド: コンパイル システムは、アプリケーションの終了時に DLL のロードと DLL アンロードのエンコードを完了します (存在する場合)。 DLL が使用されると、DLL の Windows アプリケーション レコードは 1 つ減らされ、関連するすべてのプログラムが DLL の使用を完了するまで解放されません。これはシンプルで実用的ですが、柔軟性が十分ではなく、次の条件を満たすことしかできません。一般的な要件

hidden 暗黙的呼び出し: ダイナミック リンク ライブラリ生成時に生成される .LIB ファイルをアプリケーション プロジェクトに追加する必要がある DLL 内の関数を使用する場合は、それを説明するだけで済みます暗黙的な呼び出しでは、LoadLibrary() および FreeLibrary() を呼び出す必要はありません プログラマが DLL ファイルを作成すると、リンカは対応する LIB インポート ファイルを自動的に生成します このファイルには、エクスポートされた各 DLL 関数のシンボル名とオプションの識別番号が含まれますが、実際のコードは含まれていません。LIB ファイルは、DLL の置換ファイルとしてアプリケーション プロジェクトにコンパイルされます。

プログラマが静的リンクを通じてアプリケーションをコンパイルおよび生成すると、アプリケーション内の呼び出し関数は、 LIB ファイルにエクスポートされたシンボル。これらのシンボルまたは識別番号は、生成された EXE ファイルに入力されます。LIB ファイルには、対応する DLL ファイル名 (ただし完全なパス名ではありません) も含まれており、リンカはそれを EXE ファイル内に保存します。

いつ アプリケーションの実行中にアプリケーションが DLL ファイルをロードする必要がある場合、Windows はこの情報に基づいて DLL を検出してロードし、シンボル名または識別番号を通じて DLL 関数を動的にリンクします。呼び出されるすべての DLL ファイルアプリケーションによってアプリケーションにロードされる EXE ファイルがメモリにロードされる 実行可能プログラムは、DLL によって出力される関数情報を含む入力ライブラリ ファイル (.LIB ファイル) にリンクされます オペレーティング システムは、実行可能ファイルが実行されるときに DLL をロードしますプログラムが読み込まれます 実行可能プログラムは、関数名を通じて直接 DLL を呼び出します 出力関数、呼び出し方法はプログラム内の他の関数と同じです

2. 動的呼び出し方法: プログラマは API 関数を使用して、 DLL を呼び出す目的を達成するには、DLL をロードおよびアンロードします。これは使用がより複雑ですが、メモリをより効率的に使用できるため、大規模なアプリケーションをコンパイルする重要な方法です。

明示的な呼び出し:

アプリケーション内で MFC が提供する LoadLibrary または AfxLoadLibrary を使用して、作成したダイナミック リンク ライブラリを明示的に呼び出すことを指します。ダイナミック リンク ライブラリのファイル名は上記です。 2 つの関数を入力し、GetProcAddress() を使用して導入する関数を取得します。今後は、このインポートされた関数をこのアプリケーションのカスタム関数と同じように呼び出すことができます。アプリケーションを終了する前に、MFC が提供する FreeLibrary または AfxFreeLibrary を使用してダイナミック リンク ライブラリを解放する必要があります。 Win32 LoadLibary 関数を直接呼び出し、DLL へのパスをパラメータとして指定します。 LoadLibary は、アプリケーションが GetProcAddress 関数を呼び出すときに使用する HINSTANCE パラメータを返します。 GetProcAddress 関数は、シンボリック名または識別番号を DLL 内のアドレスに変換します。プログラマは、DLL ファイルをいつロードするかどうかを決定できます。明示的なリンクによって、実行時にどの DLL ファイルがロードされるかが決まります。 DLL を使用するプログラムは、使用する前に DLL をロードして (LoadLibrary)、DLL モジュールへのハンドルを取得し、次に GetProcAddress 関数を呼び出して出力関数のポインタを取得する必要があります。DLL は終了する前にアンロード (FreeLibrary) する必要があります。

DLL はメモリ使用量が少なく、編集が容易であるという特徴があるため、多くのコンピュータ ウイルスは DLL 形式のファイルです。しかし、一人で運営することはできません。

ダイナミック リンク ライブラリは通常、直接実行できず、メッセージを受信できません。これらは、特定のジョブを完了するために実行可能プログラムまたは他の DLL によって呼び出すことができる関数を含む独立したファイルです。これは、他のモジュールがダイナミック リンク ライブラリ内の関数を呼び出す場合にのみ機能します。

以上がdllのファイル形式は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。