ダイナミックリンク ライブラリの作成
ダイナミックリンク ライブラリ (DLL) を作成するには、1 つ以上のソース コード ファイルと、場合によっては関数をエクスポートするためのリンカー ファイルを作成する必要があります。 DLL を使うアプリケーションが読み込み時の動的リンクを使用できるようにする場合は、インポート ライブラリも作成する必要があります。
ソース ファイルの作成
DLL のソース ファイルには、エクスポートされた関数とデータ、内部関数とデータ、DLL の省略可能なエントリポイント関数が含まれています。 Windows ベースの DLL の作成をサポートする任意の開発ツールを使用できます。
DLL がマルチスレッド アプリケーションで使われる可能性がある場合は、DLL を "スレッドセーフ" にする必要があります。 データの破損を回避するには、すべての DLL のグローバル データに対するアクセスを同期する必要があります。 また、スレッドセーフでもあるライブラリとのみリンクするように確保する必要があります。 たとえば、Microsoft Visual C++ には複数バージョンの C ランタイム ライブラリが含まれています。1 つはスレッドセーフではなく、2 つはスレッドセーフです。
関数のエクスポート
DLL 内のどの関数をエクスポートするかを指定する方法は、開発に使っているツールによって異なります。 一部のコンパイラでは、関数宣言で修飾子を使うことにより、ソース コードで関数を直接エクスポートできます。 また、ファイルでリンカーに渡すエクスポートを指定する必要がある場合もあります。
たとえば、Visual C++ を使って DLL 関数をエクスポートするには、2 つの方法があります。__declspec (dllexport) 修飾子を使う方法と、モジュール定義 (.def
) ファイルを使う方法です。 __declspec (dllexport) 修飾子を使う場合、.def
ファイルを使う必要はありません。 詳細については、「DLL からのエクスポート」を参照してください。
インポート ライブラリの作成
インポート ライブラリ (.lib
) ファイルには、エクスポートされた DLL 関数への外部参照をリンカーが解決するために必要な情報が含まれています。そのため、システムは、実行時に指定された DLL とエクスポートされた DLL 関数を特定できます。 DLL をビルドするときに、DLL のインポート ライブラリを作成できます。
詳細については、「インポート ライブラリとエクスポート ファイルのビルド」を参照してください。
インポート ライブラリの使用
たとえば、CreateWindow 関数を呼び出すには、コードをインポート ライブラリ User32.lib
にリンクする必要があります。 その理由は、CreateWindow は User32.dll
というシステム DLL に存在し、また、User32.lib
は、コード内の呼び出しを User32.dll
のエクスポートされた関数に解決するために使われるインポート ライブラリであるためです。 このリンカーによって、各関数呼び出しのアドレスを含むテーブルが作成されます。 DLL 内の関数の呼び出しは、DLL が読み込まれるときに修正されます。 システムがプロセスを初期化している間に、User32.dll
が読み込まれます。これは、このプロセスがその DLL 内のエクスポートされた関数に依存しているためです。また、関数アドレス テーブル内のエントリが更新されます。 CreateWindow のすべての呼び出しにより、User32.dll
からエクスポートされた関数が呼び出されます。
詳細については、実行可能ファイルの DLL へのリンクに関する記事を参照してください。