DLL(Dynamic Link Libraryの略)は、複数のプログラムが同時に使用できるコードとデータを含むファイルの一種です。Windowsのほとんどのアプリケーションファイルは完全ではなく、比較的独立したダイナミックリンクライブラリ(DLLファイル)に分割されています。特定の手順を実行すると、対応するDLLファイルが呼び出されます。1つのアプリケーションで複数のDLLファイルを使用でき、DLLファイルは別のアプリケーションでも使われることがあります。
DLLファイルにはさまざまなプログラムの機能が格納されています。プログラムが関数を呼び出す必要がある場合、まずDLLをロードし、次に関数のアドレスを取得し、最後に呼び出しを開始します。DLLファイルを使用すれば、プログラムは特定の機能が必要になったときにコードを読み込めば良いので、実行開始時にすべてのコードを読み込む必要がありません。
Windowsには、一般的なダイアログボックス関連の機能を実行できるComdlg32.dllというDLLファイルがあります。各アプリケーションは、このDLLに含まれる機能を使用して「開く」ダイアログボックスを呼び出します。これにより、コードの再利用と効率的なメモリ使用が可能となります。
オペレーティングシステムには、ActiveXコントロール(.ocx)ファイル(例: カレンダーコントロール)、コントロールパネル(.cpl)ファイル(例: コントロールパネルの項目)、デバイスドライバー(.drv)ファイル(例:プリンタードライバー)など、DLLとして実装されるさまざまな種類のファイルがあります。
DLLの利点
リソースの使用量が少ない
DLLは、複数のプログラムが同じ関数ライブラリを使用する場合、物理メモリとハードドライブに読み込まれるコードの重複を減らすことがあります。これは、フォアグラウンドで実行されているプログラムだけでなく、Windowsオペレーティングシステムで実行されている他のアプリケーションのパフォーマンスにも大きな影響を与えます。
モジュラーアーキテクチャを推進
DLLはモジュラープログラムの開発に寄与し、複数の言語バージョンやモジュラーアーキテクチャを必要とするアプリケーションの開発に役立ちます。例えば、会計プログラムには、実行時に動的に読み込むことができるモジュールがたくさんあります。
展開とインストールの簡素化
DLLファイル内の機能を更新・修正する場合、DLLの展開とインストールでは、プログラムとDLL間のリンクを再確立する必要はありません。さらに、複数のプログラムが同じDLLを使用している場合、これらのプログラムは更新や修正の恩恵を受けます。
リンク方法
プログラムでDLLをロードする際、エクスポートされたDLL関数を呼び出すリンク方法として、ロードタイムダイナミックリンキングとランタイムダイナミックリンキングの2つがあります。
ロードタイムダイナミックリンキングでは、プログラムはローカル関数のようにエクスポートされたDLL関数に明示的な呼び出しを行います。このリンク方法を使用するには、アプリケーションのコンパイルやリンク時に、ヘッダー(.h)ファイルとインポートライブラリ(.lib)ファイルを指定します。その後、リンカーはDLLのロードに必要な情報をシステムに提供し、読み込み時にエクスポートされたDLL関数の位置を解決します。
ランタイムダイナミックリンキングでは、プログラムはLoadLibraryEx関数またはLoadLibrary関数のいずれかを呼び出して、実行時にDLLを読み込みます。DDLの読み込みに成功したら、GetProcAddress関数を使用して、呼び出したいエクスポートされたDLL関数のアドレスを取得します。このリンクを使用する場合、インポートライブラリファイルは不要です。
DLLのトラブルシューティング
Dependency WalkerやDLL Universal Problem Solverなど、DLLの問題のトラブルシューティングに役立つ数多くのツールがあります。Windows OSの機能、バックアップ、特定のファイルのダウンロードによって、DLLファイルを修復することもできます。
ヒント: DLLファイルが見つからないというエラーメッセージが表示されたら、どうすれば良いでしょうか?こちらの記事「Windows 10/8/7でDLLファイルが見つからない場合の対処法」をご覧下さい。