- •Лекция 11
- •Понятие DLL
- •DLL — это библиотека, содержащая код и данные, которые могут использоваться более чем
- •Некоторые из файлов, которые реализованы в виде библиотеки DLL в операционных системах Windows:
- •Преимущества DLL
- •Динамическое связывание во время загрузки
- •Когда система начинает программу, которая использует выполняемую при загрузке динамическую связь, используется информация
- •Если SafeDllSearchMode равно 1, порядок поиска происходит как указано ниже:
- •Динамическое связывание во время выполнения
- •В обращении к функции GetProcAddress следует указывать адрес подпрограммы, которую необходимо задействовать. Допускается
- •Создание динамически компонуемых библиотек
- •Функция AddNumbers определена как экспортируемая (с точки зрения DLL), и ей присвоен порядковый
- •Приложения, реализующие динамическое связывание с DLL во время загрузки, должны включать этот файл,
- •Если DLL не сопровождается библиотекой импорта, для информирования модуля подключения о местонахождении подпрограмм
- •Пример создания простой DLL
- •Использование динамического связывания выполняемого при загрузке
- •Использование динамического связывания периода выполнения
- •//Простая программа, которая использует функции LoadLibrary и GetProcAddress,
- •Доступ к данным в DLL
- •Для файла описания модуля возможно изменение стандартных атрибутов глобальных и статических данных, что
- •Использование уведомляющей точки входа DLL
- •Описание функций динамически
- •GetModuleFileName
Для файла описания модуля возможно изменение стандартных атрибутов глобальных и статических данных, что предоставляет общий доступ к данным для всех процессов, использующих DLL. Например, в результате включения следующей строки в файл определений модуля все инициализированные данные будут распределяться между всеми процессами, а неинициализированные данные останутся приватными для каждого процесса. Этот оператор требует, чтобы в исходном файле DLL было указано, какие данные необходимо поместить в сегмент данных .GLOBALS. Пример содержится в описании функции DLLEntryPoint.
SECTIONS
.GLOBALS READ WRITE SHARED
Наконец, DLL может использовать функции локальной области хранения потока для получения таблицы значений, которые уникальны для каждого потока, выполняющего доступ к DLL.
Кроме того, использование локальной области хранения потока обычно требует реализации в DLL уведомляющей точки входа (notification entry point).
Использование уведомляющей точки входа DLL
Уведомляющая точка входа обеспечивает информирование DLL при каждом присоединении и отключении процесса, а также когда присоединенный к DLL процесс создает или завершает поток. Для реализации уведомляющей точки входа в DLL потребуется поместить код функции, основанной на прототипе DLLEntryPoint.
BOOL DLLEntryPoint(HINSTANCE hlnstDLL,
DWORD dwNotification, LPVOID IpReserved);
Имя функции DLLEntryPoint служит просто заполнителем. По умолчанию модуль подключения ищет функцию с именем DLLMain. При определении точки входа в DLL функции можно присвоить любое имя. Обычно это выполняется с помощью ключа /entry в командной строке модуля подключения, как показано в следующем фрагменте кода:
link /entry:MyEntry /machine:1X86 mydll.obj
Дополнительные сведения можно найти в подробном описании этой функции.
Описание функций динамически |
|
компонуемых библиотек |
|
Функция |
Назначение |
DisableThreadLibraryCalls |
Отключает уведомления DLL_THREAD_ATTACH и |
|
DLL_THREAD_DETACH для указанной динамически |
|
подключаемой библиотеки (DLL). |
DllMain |
Дополнительная точка входа в динамически подключаемую |
|
библиотеку (DLL). |
FreeLibrary |
Уменьшает итоговое число ссылок на загруженные |
|
динамически подключаемые библиотеки (DLL). Когда |
|
итоговое число ссылок достигает нуля, модуль отменяет |
|
отображение в адресном пространстве вызывающего |
|
процесса. |
FreeLibraryAndExitThread |
Уменьшает итоговое число ссылок загруженной динамически |
|
подключаемой библиотеки (DLL) до единицы, также, как это |
|
делает FreeLibrary , затем вызывает ExitThread, чтобы |
|
завершить работу вызывающего потока. |
GetDllDirectory |
Извлекает конкретную для приложения часть пути поиска, |
|
используемого, чтобы определить |
|
местонахождение DLLs для прикладной программы. |
GetModuleFileName |
Функция GetModuleFileName извлекает полный путь доступа к |
|
файлу, содержащему указанный модуль, которым владеет |
|
текущий процесс. |
GetModuleFileNameEx Функция GetModuleFileNameEx извлекает полный путь доступа к |
|
|
файлу, содержащему заданный модуль. |
GetModuleHandle |
Функция GetModuleHandle извлекает дескриптор указанного |
|
модуля, если файл был отображен в адресном пространстве |
|
вызывающего процесса. |
GetModuleHandleEx |
Функция GetModuleHandleEx извлекает дескриптор указанного |
|
модуля, если файл был отображен в адресное пространство |
|
вызывающего процесса. |
GetProcAddress |
Функция GetProcAddress извлекает адрес экспортируемой |
|
функции или переменной от заданной динамически подключаемой |
|
библиотеки (DLL). |
LoadLibrary |
Функция LoadLibrary отображает заданный исполняемый модуль |
|
в адресное пространство вызывающего процесса. |
LoadLibraryEx |
Функция LoadLibraryEx отображает указанный исполняемый |
|
модуль в адресное пространство вызывающего процесса. |
SetDllDirectory |
Функция SetDllDirectory добавляет каталог к пути поиска, |
|
используемый, чтобы определить местонахождение DLL для |
|
прикладной программы. |