Книга: Системное программирование в среде Windows
Точки входа библиотеки DLL
Точки входа библиотеки DLL
Для каждой создаваемой DLL вы можете указать точку входа запуска библиотеки, которая обычно автоматически вызывается при каждом подключении или отключении процесса. В то же время, в функции LoadLibraryEx предусмотрена опция, позволяющая подавить вызов точки входа. В случае неявно связываемых (связываемых во время выполнения) библиотек DLL подключение и отключение процесса происходит, соответственно, при его запуске и завершении. В случае же явно связываемых DLL это осуществляется при вызове функций LoadLibrary, LoadLibraryEx и FreeLibrary.
Кроме того, точка входа вызывается всякий раз, когда процесс создает новый поток (глава 7) или прекращает его выполнение.
Точкой входа с именем DllMain, прототип которой приводится ниже, мы воспользуемся в полной мере только в главе 12 (программа 12.4), где она предоставит потокам удобный способ управления ресурсами и так называемыми локальными областями хранения потоков (Thread Local Storage, SLT) в DLL с многопоточной поддержкой.
BOOL DllMain(HINSTANCE hDll, DWORD Reason, LPVOID Reserved)
Параметр hDll является дескриптором экземпляра DLL, возвращенным функцией LoadLibrary. Значение NULL параметра Reserved указывает на то, что подключение процесса к библиотеке произошло в результате вызова функции Load-Library; иные значения этого параметра свидетельствуют о подключении к библиотеке в результате неявного связывания во время загрузки. Подобным образом, к значению NULL параметра Reserved приводит и отключение процесса от библиотеки в результате вызова функции FreeLibrary.
Параметр Reason может иметь одно из четырех значений: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. Функции точки входа DLL обычно используют операторы switch и в качестве индикатора успешного выполнения возвращают значение TRUE.
Система сериализует вызовы DllMain таким образом, что в каждый момент времени выполнять ее может только один поток (к подробному обсуждению потоков мы приступим в главе 7). Эта сериализация весьма существенна, поскольку операции инициализации, которые должна выполнять DllMain, не должны прерываться до их завершения. По этой же причине внутри точки входа не рекомендуется использовать блокирующие вызовы функций, например, функций ввода/вывода или функций ожидания (см. главу 8), поскольку они будут препятствовать запуску точки входа другими потоками. В частности, не следует вызывать внутри точки входа DLL функции LoadLibrary и LoadLibraryEx, поскольку это будет порождать дополнительные вызовы точек входа DLL.
Функция DisableThreadLibraryCalls отменяет отправку указанному экземпляру DLL уведомлений о подключении и отключении потоков. Запрет отправки уведомлений может пригодиться в тех случаях, когда потоки не нуждаются в каких-либо уникальных ресурсах во время инициализации.
- Архитектура системы управления памятью в Win32 и Win64
- Куча
- Управление памятью кучи
- Пример: сортировка файлов с использованием бинарного дерева поиска
- Отображение файлов
- Пример: последовательная обработка файлов с использованием метода отображения
- Пример: сортировка отображенных файлов
- Базовые указатели
- Пример: использование базовых указателей
- Динамически компонуемые библиотеки
- Пример: явное связывание функци и преобразования файлов
- Точки входа библиотеки DLL
- Управление версиями DLL
- Резюме
- Упражнения
- Настройка библиотеки
- Обеспечение безопасности библиотеки
- Удаление библиотеки
- Я забыл пароль входа в Windows, можно ли зайти в систему, не зная пароля?
- 12.5. Другие библиотеки для создания графических интерфейсов
- Точка входа в программу
- Создание контрольной точки восстановления
- 15.3.2. Установка контрольных точек, пошаговое выполнение и отслеживаемые точки
- Библиотеки SharePoint
- 4.2.8. Деятельность внутреннего злоумышленника с точки зрения формальных полномочий
- Ситуация с точки зрения подрядчика
- 14.3.2. Дополнительные замечания по поводу библиотеки shell.rb