Азбука программирования в Win32 API


Азбука программирования в Win32 API - стр. 207


Первый аргумент этой функции - это хэндл библиотеки, присваивае­мый системой.

Второй аргумент указывает причину вызова этой библиотеки систе­мой.

Третий аргумент, как понятно из его названия, пока зарезервирован и обычно должен быть равным NULL.

Теперь нам необходимо до конца разобраться с причинами вызова библиотеки.

DLL_PROCESS_ATTACH

Система вызывает функцию инициализации с этим значением пара­метра fdwReason единственный раз при загрузке библиотеки. Другими словами, если один из потоков процесса, вызвавшего DLL, пытается вновь загрузить ее с помощью LoadLibraryQ, то обращение к DLL с параметром DLL_PROCESS_ATTACH не произойдет. Система увеличит счетчик пользователей этой DLL.

Значение, возвращаемое функцией инициализации, после обработки DLL_PROCESS_ATTACH, уведомляет пользователя, была ли инициали­зация успешной. В случае неуспешной инициализации функция должна возвратить FALSE, при успехе - TRUE. Это значение используется как при неявной, так и при явной загрузке DLL в память.

248

DLL PROCESS JDETACH

Вызов функции инициализации для обработки DLL_PROCESS_DETACH означает, что библиотека из памяти выгружа­ется и должна произвести действия по деинициализации самое себя. Помимо того, что необходимо освободить память и другие ресурсы, хорошим тоном считается оставить систему точно в том же состоянии, в каком ее приняла библиотека (если, конечно, изменение параметров системы не является задачей одной из функций DLL). При выгрузке библиотеки есть одна тонкость, связанная с причиной завершениия процесса, обратившегося к ней. Если DLL выгружается в связи с вызовом функции ExitProcessQ (или FreeLibraryQ, хотя это и не связано с процес­сом), вызов функции инициализации проходит нормально. Но если процесс завершается благодаря функции TerminateProcess(), функция инициализации НЕ ВЫЗЫВАЕТСЯ! Таким образом, попутно можно сделать еще один вывод - функцией TerminateProcessQ можно и нужно пользоваться только в самых крайних случаях!

Ниже приведен чуть измененный листинг библиотеки dll.c; попробуй­те загрузить ее и понаблюдать за тем, как она работает:




Начало  Назад  Вперед



Книжный магазин