Данные библиотеки 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(thread). Если этот синтаксис используется в библиотеке DLL, вы не сможете явно загрузить библиотеку DLL с помощью LoadLibrary или LoadLibraryEx в версиях Windows до Windows Vista. Если библиотека DLL будет загружена явным образом, необходимо использовать функции локального хранилища потока вместо _declspec(thread).