web-dev-qa-db-ja.com

DLLファイルとはどのようなもので、どのように機能しますか?

DLLファイルはどのように機能しますか?それらの多くは非常に多いようですが、私はそれらが何であるか、またはそれらがどのように機能するかを知りません。

だから、彼らとの契約は何ですか?

189
stalepretzel

DLLとは何ですか?

ダイナミックリンクライブラリ(DLL)はEXEに似ていますが、直接実行することはできません。これらは、Linux/Unixの.soファイルに似ています。つまり、DLLはMSの共有ライブラリの実装です。

DLLはEXEに非常に似ているため、ファイル形式自体は同じです。 EXEとDLLはどちらもPortable Executable(PE)ファイル形式に基づいています。 DLLには、COMコンポーネントと.NETライブラリも含めることができます。

DLLには何が含まれますか?

DLLには、EXE、またはその他のDLLが使用する関数、クラス、変数、UI、およびリソース(アイコン、画像、ファイルなど)が含まれています。

ライブラリの種類:

ほぼすべてのオペレーティングシステムには、2種類のライブラリがあります。静的ライブラリと動的ライブラリ。 Windowsでは、ファイル拡張子は次のとおりです。静的ライブラリ(.lib)および動的ライブラリ(.dll)。主な違いは、コンパイル時に静的ライブラリが実行可能ファイルにリンクされることです。一方、動的リンクライブラリは実行時までリンクされません。

静的および動的ライブラリの詳細:

静的ライブラリはモジュール(EXEまたはDLL)内に直接埋め込まれているため、通常はコンピューター上に静的ライブラリは表示されません。動的ライブラリは、スタンドアロンのファイルです。

DLLはいつでも変更でき、EXEがDLLを明示的にロードするときにのみ実行時にロードされます。静的ライブラリは、EXE内でコンパイルされると変更できません。 DLLは、EXE自体を更新せずに個別に更新できます。

DLLのロード:

プログラムは、起動時に、Win32 API LoadLibraryを介して、または別のDLLの依存関係であるときに、DLLをロードします。プログラムはGetProcAddressを使用して関数をロードするか、LoadResourceを使用してリソースをロードします。

さらに読む:

詳細については、 MSDN または Wikipedia を確認してください。また、この答えのソース。

249
Brian R. Bondy

DLLとは何ですか?

DLLファイルは、実行可能コードとイメージなどのリソースを含むことができるバイナリファイルです。アプリケーションとは異なり、これらは直接実行できませんが、アプリケーションは必要に応じて(または起動時に一度に)それらをロードします。

重要ですか?

ほとんどのアプリケーションは、起動時に必要なDLLファイルをロードします。これらのいずれかが見つからない場合、システムはプロセスをまったく開始できません。

DLLファイルには他のDLLファイルが必要な場合があります

アプリケーションがDLLファイルを必要とするのと同様に、DLLファイルは他のDLLファイル自体に依存している場合があります。依存関係のチェーンでこれらのDLLファイルのいずれかが見つからない場合、アプリケーションはロードされません。これは、 Dependency Walker などの依存関係ウォーカーツールを使用して簡単にデバッグできます。

それらの多くはシステムフォルダにあります

システム機能のほとんどは、コード/リソースを共有する標準形式であるため、DLLファイルの形式でユーザープログラムに公開されます。各機能は異なるDLLファイルに個別に保持されるため、必要なDLLファイルのみがロードされ、システムのメモリ制約が軽減されます。

インストールされたアプリケーションもDLLファイルを使用します

DLLファイルは、上記で説明したように、機能を物理的に分離する形式にもなります。また、優れたアプリケーションは、絶対に必要になるまでDLLファイルをロードしないようにします。これにより、メモリ要件が削減されます。これにより、アプリケーションは多くのDLLファイルとともに出荷されます。

DLL Hell

ただし、共有DLLファイルとそれらを必要とするプログラムのバージョンが一致しない場合、システムのアップグレードによって他のプログラムが中断されることがあります。システムチェックポイントおよびDLLキャッシュなどは、この問題を解決するためのM $の取り組みです。 .NETプラットフォームは、この問題にまったく直面しない可能性があります。

DLLファイルの内容を知るにはどうすればよいですか?

DUMPBIN またはDependency Walkerのような外部ツールを使用する必要があります。これは、DLL内に含まれる公に見える機能(エクスポートと呼ばれる)を表示するだけではありません_ファイルと、必要なその他のDLLファイル、およびこれらのDLLファイルからエクスポートするDLLファイルが依存するファイル。

それらをどのように作成/使用しますか?

ベンダーのプログラミングドキュメントを参照してください。 C++については、MSDNの LoadLibrary を参照してください。

34
computinglife

ライブラリにあるいくつかの関数を使用する実行可能ファイルを作成するとします。

使用しているライブラリがstaticの場合、リンカーはこれらの関数のオブジェクトコードをライブラリから直接コピーし、実行可能ファイルに挿入します。

この実行可能ファイルが実行されると、必要なものがすべて揃うため、実行可能ファイルローダーはメモリにロードして実行するだけです。

ライブラリがdynamicの場合、リンカはオブジェクトコードを挿入しませんが、基本的にこの関数がこの場所にあるDLLにあると言うスタブを挿入します。

この実行可能ファイルが実行されると、実行可能ファイルの一部(つまりスタブ)が失われるため、ローダーは実行可能ファイルを調べて、不足しているスタブを修正します。すべてのスタブが解決された後にのみ、実行可能ファイルの実行が許可されます。

これを実際に確認するには、DLLを削除または名前を変更し、実行可能ファイルを実行しようとしたときにローダーが欠落しているDLLエラーを報告する方法を確認します。

そのため、名前Dynamic Link Library、リンク処理の一部は実行可能ローダーによって実行時に動的に実行されます。

最後の注意点として、DLLにリンクしない場合、スタブはリンカーによって挿入されませんが、WindowsはまだGetProcAddress APIを提供します。実行可能ファイルが開始された後、DLL関数エントリポイントを実行します。

13
jussij

DLL(ダイナミックリンクライブラリ)とSL(共有ライブラリ、UNIXで同等)は、ロード時に実行可能ファイルに動的にリンクできる実行可能コードのライブラリです。

静的ライブラリはコンパイル時に実行可能ファイルに挿入され、その時点から修正されます。実行可能ファイルのサイズが大きくなり、共有できません。

動的ライブラリには次の利点があります。

1 /コンパイル時ではなく実行時にロードされるため、実行可能ファイルとは独立して更新できます(Windowsで表示される派手なウィンドウとダイアログボックスはすべてDLLから取得されるため、アプリケーションのルックアンドフィールはユーザーなしで変更できます)書き換える必要があります)。

2 /独立しているため、複数の実行可能ファイルでコードを共有できます。単一のDLLで100個のアプリを実行している場合、DLLのコピーは1つだけなので、メモリを節約できます。メモリ。

主な欠点は利点#1です。DLLをアプリケーションに依存せずに変更すると、アプリケーションの動作が停止したり、奇妙な動作を開始したりする場合があります。 DLLバージョン管理は、Windowsではあまりうまく管理されない傾向があり、これが「DLL Hell」という奇妙な名前につながります。

12
paxdiablo

DLLファイルには、Export Tableが含まれています。これは、呼び出し側プログラムが検索できるシンボルのリストです。シンボルは通常、 C呼び出し規約__ stcall )の関数です。エクスポートテーブルには、関数のアドレスも含まれています。

この情報を使用すると、コンパイル時にDLLにアクセスできなくても、呼び出しプログラムはDLL内の関数を呼び出すことができます。

ダイナミックリンクライブラリの紹介にはさらに情報があります。

10
Adam Pierce

http://support.Microsoft.com/kb/815065

DLLは、同時に複数のプログラムで使用できるコードとデータを含むライブラリです。たとえば、Windowsオペレーティングシステムでは、Comdlg32 DLLは一般的なダイアログボックス関連の機能を実行します。したがって、各プログラムは、このDLLに含まれる機能を使用して、[開く]ダイアログボックスを実装できます。これにより、コードの再利用とメモリの効率的な使用が促進されます。

DLLを使用すると、プログラムを個別のコンポーネントにモジュール化できます。たとえば、会計プログラムはモジュールごとに販売される場合があります。各モジュールは、そのモジュールがインストールされている場合、実行時にメインプログラムにロードできます。モジュールが分離されているため、プログラムのロード時間が短縮され、モジュールはその機能が要求されたときにのみロードされます。

さらに、プログラムの他の部分に影響を与えることなく、各モジュールに更新プログラムを簡単に適用できます。たとえば、給与計算プログラムがあり、税率は毎年変わります。これらの変更がDLLに分離されると、プログラム全体を再度ビルドまたはインストールする必要なく、更新を適用できます。

http://en.wikipedia.org/wiki/Dynamic-link_library

6
Jorge Ferreira

DLLは、Windowsプログラムの複数のコードと手順を保持するために使用されるファイル拡張子および「ダイナミックリンクライブラリ」として知られるファイル形式です。ソフトウェアとゲームは、DLLファイルのベースで実行されます。 DLLファイルは、複数のアプリケーションが同時に情報を使用できるように作成されました。

DLLファイルに関する詳細情報を取得したい場合、またはエラーが発生した場合は、次の投稿を参照してください。 https://www.bouncegeek.com/fix-dll-errors-windows-586985/

2
Akshya Nagar

DLL(ダイナミックリンクライブラリ)には、1つ以上のアプリケーションまたはサービスで使用されるリソースが含まれています。クラス、アイコン、文字列、オブジェクト、インターフェース、およびUIを除く開発者が保存する必要のあるほとんどすべてのものを含めることができます。

1
tsilb