Операционные системы. Учебное пособие. Марапулец Ю.В. - 37 стр.

UptoLike

Составители: 

данные процесса доступны из динамической библиотеки и, наоборот, данные динамиче-
ской библиотеки доступны для процесса.
В любой динамической библиотеке следует определить точку ввода (процедура
ввода). При загрузке и выгрузке динамической библиотеки автоматически вызывается
процедура ввода. Следует отметить, что каким бы способом ни была загружена динами-
ческая библиотека (явно или неявно), выгрузка динамической библиотеки из памяти бу-
дет происходить автоматически при закрытии процесса или потока. В принципе, проце-
дура входа может быть использована для некоторой начальной инициализации
динамических переменных. Довольно часто эта процедура остается пустой. Для реали-
зации уведомляющей точки входа в DLL потребуется поместить код функции, основан-
ный на прототипе DLLEntryPoint().
BOOL DLLEntryPoint(HINSTANCE hInstDLL, DWORD dwNotification,
LPVOID lpReserved)
Имя функции DLLEntryPoint() служит просто заполнителем. По умолчанию мо-
дуль подключения ищет функцию с именем DLLMain(). При определении точки входа в
DLL функции можно присвоить любое имя. При вызове процедуры входа в нее поме-
щаются три параметра:
идентификатор DLL-модуля;
причина вызова;
резерв.
Рассмотрим подробнее второй параметр процедуры ввода, который может прини-
мать четыре возможных значения.
DLL_PROCESS_ATTACH - Сообщает, что динамическая библиотека загружена в
адресное пространство вызывающего процесса.
DLL_THREAD_ATTACH - Сообщает, что текущий процесс создает новый поток.
Такое сообщение посылается всем динамическим библиотекам, загруженным к это-
му времени процессом.
DLL_PROCESS_DETACH - Сообщает, что динамическая библиотека выгружается из
адресного пространства процесса.
DLL_THREAD_DETACH - Сообщает, что некий поток, созданный данным процес-
сом, в адресное пространство которого загружена данная динамическая библиотека,
уничтожается.
1.3.2. Главная функция DllMain()
Большинство библиотек DLL - просто коллекции практически независимых друг
от друга функций, экспортируемых в приложения и используемых в них. Кроме функ-
ций, предназначенных для экспортирования, в каждой библиотеке DLL должна быть
функция DllMain(). Эта функция предназначена для инициализации и очистки DLL. Она
пришла на смену функциям LibMain и WEP, применявшимся в предыдущих версиях
Windows. Структура простейшей функции DllMain() может выглядеть следующим обра-
зом:
BOOL WINAPI DllMain (HANDLE hInst, DWORD dwReason, LPVOID lpReserved)
{
BOOL bAllWentWell=TRUE ;
switch (dwReason)
{
case DLL_PROCESS_ATTACH: // Инициализация процесса.
39
данные процесса доступны из динамической библиотеки и, наоборот, данные динамиче-
ской библиотеки доступны для процесса.
     В любой динамической библиотеке следует определить точку ввода (процедура
ввода). При загрузке и выгрузке динамической библиотеки автоматически вызывается
процедура ввода. Следует отметить, что каким бы способом ни была загружена динами-
ческая библиотека (явно или неявно), выгрузка динамической библиотеки из памяти бу-
дет происходить автоматически при закрытии процесса или потока. В принципе, проце-
дура входа может быть использована для некоторой начальной инициализации
динамических переменных. Довольно часто эта процедура остается пустой. Для реали-
зации уведомляющей точки входа в DLL потребуется поместить код функции, основан-
ный на прототипе DLLEntryPoint().

BOOL DLLEntryPoint(HINSTANCE hInstDLL, DWORD dwNotification,
                       LPVOID lpReserved)

     Имя функции DLLEntryPoint() служит просто заполнителем. По умолчанию мо-
дуль подключения ищет функцию с именем DLLMain(). При определении точки входа в
DLL функции можно присвоить любое имя. При вызове процедуры входа в нее поме-
щаются три параметра:
• идентификатор DLL-модуля;
• причина вызова;
• резерв.
     Рассмотрим подробнее второй параметр процедуры ввода, который может прини-
мать четыре возможных значения.
• DLL_PROCESS_ATTACH - Сообщает, что динамическая библиотека загружена в
   адресное пространство вызывающего процесса.
• DLL_THREAD_ATTACH - Сообщает, что текущий процесс создает новый поток.
   Такое сообщение посылается всем динамическим библиотекам, загруженным к это-
   му времени процессом.
• DLL_PROCESS_DETACH - Сообщает, что динамическая библиотека выгружается из
   адресного пространства процесса.
• DLL_THREAD_DETACH - Сообщает, что некий поток, созданный данным процес-
   сом, в адресное пространство которого загружена данная динамическая библиотека,
   уничтожается.

      1.3.2. Главная функция DllMain()

     Большинство библиотек DLL - просто коллекции практически независимых друг
от друга функций, экспортируемых в приложения и используемых в них. Кроме функ-
ций, предназначенных для экспортирования, в каждой библиотеке DLL должна быть
функция DllMain(). Эта функция предназначена для инициализации и очистки DLL. Она
пришла на смену функциям LibMain и WEP, применявшимся в предыдущих версиях
Windows. Структура простейшей функции DllMain() может выглядеть следующим обра-
зом:

BOOL WINAPI DllMain (HANDLE hInst, DWORD dwReason, LPVOID lpReserved)
{
     BOOL bAllWentWell=TRUE ;
     switch (dwReason)
     {
            case DLL_PROCESS_ATTACH: // Инициализация процесса.

                                         39