Dynamic-Link ライブラリ データ

Dynamic-Link ライブラリ (DLL) には、グローバル データまたはローカル データを含めることができます。

変数のスコープ

DLL ソース コード ファイルでグローバルとして宣言されている変数は、コンパイラとリンカーによってグローバル変数として扱われますが、特定の DLL を読み込む各プロセスは、その DLL のグローバル変数の独自のコピーを取得します。 静的変数のスコープは、静的変数が宣言されているブロックに制限されます。 その結果、各プロセスには、既定で DLL グローバル変数と静的変数の独自のインスタンスがあります。

Note

開発ツールでは、既定の動作をオーバーライドできる場合があります。 たとえば、Visual C++ コンパイラは #pragma セクション をサポートし、リンカーは /SECTION オプションをサポートします。 詳細については、開発ツールに含まれているドキュメントを参照してください。

 

動的メモリ割り当て

DLL がメモリ割り当て関数 (GlobalAlloc、LocalAllocHeapAllocVirtualAlloc) のいずれかを使用してメモリを割り当てると、呼び出し元プロセスの仮想アドレス空間にメモリが割り当てられ、そのプロセスのスレッドにのみアクセスできます。

DLL では、ファイル マッピングを使用して、プロセス間で共有できるメモリを割り当てることができます。 ファイル マッピングを使用して名前付き共有メモリを作成する方法の一般的な説明については、「 ファイル マッピング」を参照してください。 DllMain 関数を使用してファイル マッピングを使用して共有メモリを設定する例については、「Dynamic-Link ライブラリでの共有メモリの使用」を参照してください。

スレッド ローカル ストレージ

スレッド ローカル ストレージ (TLS) 関数を使用すると、DLL は、マルチスレッド プロセスのスレッドごとに異なる値を格納および取得するためのインデックスを割り当てることができます。 たとえば、スプレッドシート アプリケーションでは、ユーザーが新しいスプレッドシートを開くたびに、同じスレッドの新しいインスタンスを作成できます。 さまざまなスプレッドシート操作用の関数を提供する DLL では、TLS を使用して、各スプレッドシートの現在の状態 (行、列など) に関する情報を保存できます。 スレッド ローカル ストレージの一般的な説明については、「 スレッド ローカル ストレージ」を参照してください。 DllMain 関数を使用してスレッド ローカル ストレージを設定する例については、「Dynamic-Link ライブラリでのスレッド ローカル ストレージの使用」を参照してください。

Windows Server 2003 および Windows XP: Visual C++ コンパイラでは、スレッド ローカル変数 (_declspec(thread)) を宣言できる構文がサポートされています。 DLL でこの構文を使用する場合、Windows Vista より前のバージョンの Windows では LoadLibrary または LoadLibraryEx を使用して DLL を明示的に読み込むことができません。 DLL が明示的に読み込まれる場合は、 _declspec(スレッド) の代わりにスレッド ローカル ストレージ関数を使用する必要があります。