Dynamic-Link ライブラリ データ
Dynamic-Link ライブラリ (DLL) には、グローバル データまたはローカル データを含めることができます。
変数スコープ
DLL ソース コード ファイルでグローバルとして宣言されている変数は、コンパイラとリンカーによってグローバル変数として扱われますが、特定の DLL を読み込む各プロセスは、その DLL のグローバル変数の独自のコピーを取得します。 静的変数のスコープは、静的変数が宣言されているブロックに制限されます。 その結果、各プロセスには、既定で DLL グローバル変数と静的変数の独自のインスタンスがあります。
手記
開発ツールでは、既定の動作をオーバーライドできる場合があります。 たとえば、Visual C++ コンパイラはセクション #pragma サポートし、リンカーは /SECTION オプションをサポートします。 詳細については、開発ツールに含まれているドキュメントを参照してください。
動的メモリ割り当て
DLL がメモリ割り当て関数 (GlobalAlloc、LocalAlloc、HeapAlloc、および VirtualAlloc) を使用してメモリを割り当てる場合、メモリは呼び出し元プロセスの仮想アドレス空間に割り当てられ、そのプロセスのスレッドにのみアクセスできます。
DLL では、ファイル マッピングを使用して、プロセス間で共有できるメモリを割り当てることができます。 ファイル マッピングを使用して名前付き共有メモリを作成する方法の一般的な説明については、「ファイル マッピング 参照してください。 DllMain 関数を使用してファイル マッピングを使用して共有メモリを設定する例については、「Dynamic-Link ライブラリ での共有メモリの使用」を参照してください。
スレッド ローカル ストレージ
スレッド ローカル ストレージ (TLS) 関数を使用すると、DLL はマルチスレッド プロセスのスレッドごとに異なる値を格納および取得するためのインデックスを割り当てることができます。 たとえば、スプレッドシート アプリケーションでは、ユーザーが新しいスプレッドシートを開くたびに、同じスレッドの新しいインスタンスを作成できます。 さまざまなスプレッドシート操作用の関数を提供する DLL では、TLS を使用して、各スプレッドシートの現在の状態 (行、列など) に関する情報を保存できます。 スレッド ローカル ストレージの一般的な説明については、「スレッド ローカル ストレージの 」を参照してください。 DllMain 関数を使用してスレッド ローカル ストレージを設定する例については、「Dynamic-Link ライブラリ でのスレッド ローカル ストレージの使用の」を参照してください。
Windows Server 2003 および Windows XP: Visual C++ コンパイラでは、スレッド ローカル変数 (_declspec(スレッド)を宣言できる構文がサポートされています。 DLL でこの構文を使用する場合、Windows Vista より前のバージョンの Windows では、LoadLibrary または LoadLibraryEx を使用して DLL を明示的に読み込むことができなくなります。 DLL が明示的に読み込まれる場合は、_declspec(スレッド)の代わりにスレッド ローカル ストレージ関数を使用する必要があります。