ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Category:

Данные библиотеки DLL

Начало тут:
1. динамически подключаемые библиотеки;
2. о динамически подключаемых библиотеках подробнее;
3. преимущества динамического связывания;
4. создание динамически подключаемой библиотеки;
5. функция точки входа DLL;
6. динамическое связывание во время запуска;
7. динамическое связывание во время выполнения;
8. порядок поиска DLL.

Перевод с английского статьи от 31.05.2018 г. «Dynamic-Link Library Data»:
https://docs.microsoft.com/ru-ru/windows/win32/dlls/dynamic-link-library-data
(На данный момент на этом сайте нет перевода этой статьи на русский, есть только версия на английском.)

Динамически подключаемая библиотека (DLL) может содержать глобальные данные и локальные данные.

Область видимости переменной

Переменные, объявленные в качестве глобальных в файле с исходным кодом DLL, рассматриваются в качестве глобальных переменных компилятором и компоновщиком, но каждый процесс, загружающий данную DLL, получает свою собственную копию глобальных переменных этой DLL. Область видимости статических переменных ограничена блоком, в котором статические переменные объявлены. Вследствие этого каждый процесс по умолчанию обладает своим собственным экземпляром глобальных и статических переменных DLL.

Примечание. Ваши инструменты разработки могут позволить вам переопределить [описанную выше] модель поведения по умолчанию. Например, компилятор среды Visual C++ поддерживает директиву препроцессора #pragma section, а компоновщик этой среды поддерживает параметр /SECTION. Подробнее об этом читайте в документации, поставляемой с вашими инструментами разработки.


Динамическое резервирование памяти

Когда DLL резервирует память с помощью любой из функций резервирования памяти (GlobalAlloc, LocalAlloc, HeapAlloc и VirtualAlloc), память резервируется в виртуальном адресном пространстве вызывающего процесса и является доступной только потокам выполнения процесса.

DLL может использовать отображение файла в память [file mapping], чтобы зарезервировать память, которую смогут использовать совместно несколько процессов. Подробнее о том, как использовать отображение файла в память, чтобы создать именованную область памяти для совместного использования, читайте статью «Отображение файла в память». Пример, который использует функцию DllMain, чтобы создать область в памяти для совместного использования с помощью отображения файла в память, можно найти в статье «Применение области памяти для совместного использования в DLL».

Локальное хранилище потока

Функции для работы с локальным хранилищем потока (по-английски «thread local storage» или TLS) позволяют DLL резервировать индекс [ячейки массива, который и называют локальным хранилищем потока], используемый для сохранения и последующего извлечения значения, различного для каждого потока многопоточного процесса. Например, приложение для работы с электронными таблицами может создавать новый экземпляр потока (идентичный предыдущим) каждый раз, когда пользователь открывает в приложении новую электронную таблицу. Библиотека DLL, предоставляющая [этому приложению] функции для различных операций с электронной таблицей, может использовать TLS для хранения информации о текущем состоянии каждой электронной таблицы (текущая строка, текущая колонка и так далее). Подробнее о локальном хранилище потока читайте в статье «Локальное хранилище потока». Пример, который использует функцию DllMain для работы с локальным хранилищем потока, можно найти в статье «Использование локального хранилища потока в динамически подключаемой библиотеке».

Замечание для пользователей (предыдущих по отношению к свежим на дату написания статьи версиям) операционных систем Windows Server 2003 (вики: с 24.04.2003 г.) и Windows XP (вики: с 24.08.2001 г.): компилятор среды Visual C++ поддерживает синтаксическую конструкцию, которая позволяет вам объявлять локальные для потока переменные: _declspec(thread). Если вы используете эту синтаксическую конструкцию в DLL, то вы не сможете загрузить DLL явно с помощью функции LoadLibrary или LoadLibraryEx на версиях операционных систем Windows, предшествующих операционной системе «Windows Vista» (вики: с 30.11.2006 г.). Если вы хотите загрузить вашу DLL явно, то вы должны использовать функции для работы с локальным хранилищем потока вместо синтаксической конструкции _declspec(thread).
Tags: Английский язык, Образование, Программирование
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments