文書番号: 815065 - 最終更新日: 2009年5月29日 - リビジョン: 5.9 DLL について目次概要この資料では、ダイナミック リンク ライブラリ (DLL) の概要と、DLL を使用するときに発生する可能性があるさまざまな問題について説明します。 また、独自の DLL を開発する際に考慮すべき高度な問題についても説明します。 DLL の概要としては、ダイナミック リンクの手法、DLL の依存関係、DLL エントリ ポイント、DLL 関数のエクスポート、DLL のトラブルシューティング ツールについて説明します。 この資料の最後では、DLL と Microsoft .NET Framework アセンブリとのハイレベルな比較を行います。 はじめにこの資料の対象製品として記載されている Microsoft Windows オペレーティング システムでは、その機能の多くがダイナミック リンク ライブラリ (DLL) によって提供されます。 また、これらの Windows オペレーティング システムの 1 つでプログラムを実行する際に、プログラムの機能の多くが DLL によって提供される場合があります。 たとえば、プログラムにさまざまなモジュールが多数含まれており、それらの各モジュールが DLL に含まれて配布されている場合があります。 DLL を使用することで、コードのモジュール化、コードの再利用、メモリ使用の効率化、ディスク領域の削減が促進されます。 これにより、オペレーティング システムおよびプログラムの読み込みや実行が速くなり、コンピュータ内で占めるディスク領域が小さくなります。 プログラムで DLL を使用している場合、依存関係と呼ばれる問題によってプログラムが実行されないことがあります。 プログラムで DLL が使用されると、依存関係が作成されます。 他のプログラムによってこの依存関係が上書きされ、破損すると、元のプログラムが正常に実行されない場合があります。 Microsoft .NET Framework の導入に伴い、アセンブリの使用によって、依存関係に関するほとんどの問題が解決されています。 詳細DLL についてDLL は、同時に複数のプログラムで使用できるコードおよびデータを含むライブラリです。 たとえば、Windows オペレーティング システムでは、Comdlg32 DLL によって一般的なダイアログ ボックスに関連する機能が実行されます。 各プログラムは、この DLL に含まれる機能を使用して [ファイルを開く] ダイアログ ボックスを実装できます。 これによってコードの再利用が促進され、メモリを効率的に使用できます。DLL を使用することで、プログラムを別々のコンポーネントにモジュール化できます。 たとえば、会計プログラムはモジュールごとに販売される場合があります。 各モジュールは、インストールされていれば、実行時にメイン プログラムに読み込むことができます。 モジュールが個々に分かれているため、プログラムの読み込み速度が速くなり、機能が要求された場合にのみ該当するモジュールが読み込まれます。 また、プログラムの他の部分に影響を及ぼさずに、各モジュールに更新プログラムを適用することが容易になります。 たとえば、給与支払プログラムを使用しており、税率が毎年変更されるとします。 これらの変更が DLL に限定されるものであれば、プログラム全体のビルドやインストールを再度行うことなく、更新プログラムを適用できます。 以下に、Windows オペレーティング システムに DLL として実装されているファイルの例を挙げます。
DLL のメリットここでは、プログラムで DLL を使用した場合のメリットについて説明します。
DLL の依存関係プログラムまたは DLL で、他の DLL 内の DLL 関数を使用している場合、依存関係が作成されます。 これによってプログラムは独立ではなくなり、依存関係が壊れた場合に問題が発生することがあります。 たとえば、以下のいずれかの状況によって、プログラムを実行できなくなることがあります。
依存関係の問題を最小限に抑えるために、Microsoft Windows 2000 およびそれ以降の Windows オペレーティング システムでは、以下の変更が導入されています。
DLL のトラブルシューティング ツールDLL に関する問題のトラブルシューティングのために、いくつかのツールが用意されています。 ここでは、そのうちの一部のツールを紹介します。Dependency WalkerDependency Walker ツールは、プログラムで使用されているすべての依存 DLL を再帰的にスキャンします。 Dependency Walker でプログラムを開くと、Dependency Walker は次のようなチェックを行います。
drive\Program Files\Microsoft Visual Studio\Common\Tools DLL Universal Problem SolverDLL Universal Problem Solver (DUPS) ツールは、DLL 情報の監査、比較、文書化、および表示に使用されます。 DUPS ツールは、以下のユーティリティで構成されています。
247957?
(http://support.microsoft.com/kb/247957/
)
[SAMPLE] DUPS.exe を使用して DLL の互換性に関する問題を解決する方法
DLL Help データベースDLL Help データベースは、Microsoft ソフトウェア製品によってインストールされた特定のバージョンの DLL を見つけるのに役立ちます。 DLL Help データベースの詳細については、次のマイクロソフト Web サイトを参照してください。http://support.microsoft.com/dllhelp/
(http://support.microsoft.com/dllhelp/)
DLL の開発ここでは、独自の DLL を開発する際に考慮すべき問題と要件について説明します。DLL の種類アプリケーションに DLL を読み込むと、2 つのリンク手法によって、エクスポートされた DLL 関数を呼び出すことができます。 この 2 つの手法とは、ロード時のダイナミック リンクおよび実行時のダイナミック リンクです。ロード時のダイナミック リンクロード時のダイナミック リンクでは、アプリケーションは、ローカル関数に似た、エクスポートされた DLL 関数に対して、明示的な呼び出しを行います。 ロード時のダイナミック リンクを使用するには、アプリケーションをコンパイルおよびリンクする際に、ヘッダー (.h) ファイルおよびインポート ライブラリ (.lib) ファイルを提供します。 このとき、リンカは DLL の読み込みに必要な情報をシステムに提供し、読み込み時にエクスポートされた DLL 関数の場所を解決します。実行時のダイナミック リンク実行時のダイナミック リンクでは、アプリケーションは LoadLibrary 関数または LoadLibraryEx 関数を呼び出して、実行時に DLL を読み込みます。 DLL が正常に読み込まれると、GetProcAddress 関数を使用して、呼び出そうとしているエクスポートされた DLL 関数のアドレスを取得します。 実行時のダイナミック リンクを使用する場合は、インポート ライブラリ ファイルを必要としません。ロード時のダイナミック リンクを使用する場合、および実行時のダイナミック リンクを使用する場合のアプリケーションの要件は、以下の通りです。
DLL のエントリ ポイントDLL を作成する際に、オプションでエントリ ポイント関数を指定できます。 エントリ ポイント関数は、プロセスまたはスレッドが DLL にアタッチまたはデタッチされるときに呼び出されます。 エントリ ポイント関数を使用して、DLL で必要な場合にデータ構造を初期化したり破棄したりできます。 また、アプリケーションがマルチスレッドの場合、スレッド ローカル記憶域 (TLS) を使用して、エントリ ポイント関数内の各スレッドにプライベートなメモリを割り当てることができます。 以下に、DLL エントリ ポイント関数のコード例を示します。エントリ ポイント関数は、単純な初期化タスクの実行のみとし、他の DLL の読み込み関数や終了関数を呼び出さないでください。 たとえば、エントリ ポイント関数では、LoadLibrary 関数または LoadLibraryEx 関数を直接的または間接的に呼び出すことは避けてください。 また、プロセスの終了時に FreeLibrary 関数を呼び出さないでください。 注 : マルチスレッド アプリケーションでは、データの破損を防ぐため、DLL グローバル データへのアクセスが同期化される (スレッド セーフである) ようにしてください。 これを行うには、TLS を使用して、各スレッドに一意のデータを提供します。 DLL 関数のエクスポートDLL 関数をエクスポートするには、エクスポートされる DLL 関数に関数キーワードを追加するか、またはエクスポートされる DLL 関数を記載したモジュール定義 (.def) ファイルを作成することができます。関数キーワードを使用するには、エクスポートする各関数を次のキーワードで宣言する必要があります。 __declspec(dllexport) エクスポートされた DLL 関数をアプリケーションで使用するには、インポートする各関数を次のキーワードで宣言する必要があります。__declspec(dllimport) 通常、define ステートメントおよび ifdef ステートメントを持つ 1 つのヘッダー ファイルを使用して、エクスポート ステートメントとインポート ステートメントを区別します。モジュール定義ファイルを使用して、エクスポートされる DLL 関数を宣言することもできます。 モジュール定義ファイルを使用する場合は、エクスポートされる DLL 関数に関数キーワードを追加する必要はありません。 モジュール定義ファイルでは、DLL の LIBRARY ステートメントおよび EXPORTS ステートメントを宣言します。 以下に、定義ファイルのコード例を示します。 サンプル DLL およびアプリケーションMicrosoft Visual C++ 6.0 では、[Win32 Dynamic-Link Library] プロジェクト タイプまたは [MFC AppWizard (dll)] プロジェクト タイプを選択することで、DLL を作成できます。次のコードは、Visual C++ で [Win32 Dynamic-Link Library] プロジェクト タイプを使用して作成された DLL の例です。 実行時のダイナミック リンクでは、次のようなコードを使用して、SampleDLL.dll というエクスポートされた DLL 関数を呼び出します。
.NET Framework アセンブリMicrosoft .NET および .NET Framework の導入に伴い、アセンブリの使用によって、DLL に関するほとんどの問題が解決されています。 アセンブリは、.NET の共通言語ランタイム (CLR) の制御下で実行される機能の論理的な単位です。 物理的には、アセンブリは .dll または .exe ファイルとして存在します。 しかし、内部的には、アセンブリは Microsoft Win32 DLL とは大きく異なります。アセンブリ ファイルには、アセンブリ マニフェスト、タイプ メタデータ、Microsoft Intermediate Language (MSIL) コード、およびその他のリソースが含まれています。 アセンブリ マニフェストには、アセンブリが自己記述的であるために必要なすべての情報を提供するアセンブリ メタデータが含まれています。 アセンブリ マニフェストには、以下の情報が含まれています。
ここでは、アセンブリの機能をいくつか挙げ、Win32 DLL の機能と比較して説明します。
関連情報DLL および .NET Framework アセンブリの詳細については、次のマイクロソフト Web サイトを参照してください。 DLL Help データベース http://support.microsoft.com/dllhelp (http://support.microsoft.com/dllhelp) DLL Hell の終焉 http://msdn.microsoft.com/ja-jp/library/ms811694.aspx (http://msdn.microsoft.com/ja-jp/library/ms811694.aspx) アプリケーションで共有する Side-by-Side コンポーネントの実装 (拡張) http://msdn.microsoft.com/ja-jp/library/ms811700.aspx (http://msdn.microsoft.com/ja-jp/library/ms811700.aspx) Windows XP で分離アプリケーションと Side-by-Side アセンブリをビルドし、サービスを提供する方法 http://msdn.microsoft.com/ja-jp/library/ms997620.aspx (http://msdn2.microsoft.com/ja-jp/library/ms997620.aspx) .NET Framework による導入の単純化と DLL Hell の解消 http://msdn.microsoft.com/ja-jp/library/ms973843.aspx/ (http://msdn.microsoft.com/ja-jp/library/ms973843.aspx) .NET Framework 開発者ガイド : 共通言語ランタイムのアセンブリ http://msdn.microsoft.com/ja-jp/library/hk5f40ct.aspx (http://msdn.microsoft.com/ja-jp/library/hk5f40ct.aspx) 実行時のダイナミック リンク http://msdn.microsoft.com/ja-jp/library/ms685090.aspx (http://msdn.microsoft.com/ja-jp/library/ms685090.aspx) スレッド ローカル ストレージ http://msdn.microsoft.com/ja-jp/library/ms686749.aspx (http://msdn.microsoft.com/ja-jp/library/ms686749.aspx) この資料は以下の製品について記述したものです。
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" | サポート技術情報の翻訳
|
先頭へ戻る
