Наконец, DLL может использовать функции локальной области хранения потока для получения таблицы значений, которые уникальны для каждого потока, выполняющего доступ к DLL. Дополнительные сведения о локальной области хранения потока содержатся в главе 25. Кроме того, использование локальной области хранения потока обычно требует реализации в 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
Дополнительные сведения можно найти в подробном описании этой функции.
Описание функций динамически компонуемых библиотек
В табл. 30.1 перечислены функции, используемые для взаимодействия с динамически компонуемыми библиотеками. Затем следуют подробные описания каждой функции.
Таблица 30. 1 Перечень функций DLL |
||||||||
Функция |
Назначение |
|||||||
DisableThreadLibraryCalls |
Запрещает Windows отправлять уведомления указанной библиотеке во время создания или завершения потока. |
|||||||
DLLEntryPoint |
Необязательная уведомляющая точка входа для DLL. |
|||||||
FreeLibrary |
Декрементирует значение счетчика использований загруженной DLL и удаляет DLL из памяти, когда значение счетчика достигает нуля. |
|||||||
FreeLibraryAndExitThread |
Декрементирует значение счетчика использований загруженной DLL и удаляет DLL из памяти, когда значение счетчика достигает нуля. Завершает вызывающий поток. |
|||||||
GetProcAddress |
Возвращает адрес подпрограммы, размещенной в DLL. |
|||||||
LoadLibrary |
При необходимости загружает DLL в память. Инкрементирует значение счетчика использований DLL и возвращает дескриптор DLL. r |
|||||||
LoadLibraryEx |
При необходимости загружает DLL в память. Инкрементирует значение счетчика использований DLL и возвращает дескриптор DLL. Позволяет вызывающему приложению отключать уведомления-' DLL во время создания и завершения процессов и потоков. |
|||||||
DisableThreadLibraryCalls • Windows 98 • Windows 2000 |
||||||||
Описание |
Функция DisableThreadLibraryCalls информирует Windows, что не следует в дальнейшем уведомлять указанную DLL в случаях, когда приложение создает или завершает потоки. Использовать эту функцию необходимо внимательно, поскольку может потребоваться, чтобы DL,L предоставляли структуры или ресурсы для каждого потока. Если точно известно, что ни одна DLL не требует сообщений, уведомляющих о потоках, а приложение создает и завершает множество потоков, использование DisableThreadLibraryCalls может повысить быстродействие. Если DLL имеет статическую локальную область хранения потока, эта функция не может быть выполнена. |
|||||||
Синтаксис |
BOOL DisableThreadLibraryCalls( HMODULE hDLObrary ) |
|||||||
Параметры |
||||||||
HDLLibrary |
HMODULE: Дескриптор DLL. Этот дескриптор возвращается функцией LoadLibrary. |
|||||||
Возвращаемое значение |
BOOL: В случае успешного завершения возвращается значение TRUE. В противном случае — FALSE. Приложение может получать дополнительную информацию при помощи функции GetLastError. |
|||||||
Включаемый файл |
winbase.h |
|||||||
См. также |
LoadLibrary, LoadLibraryEx |
|||||||
DLLEntryPoint • Windows 98 • Windows 2000 |
||||||||
Описание |
Windows обращается к функции DLLEntryPoint с целью уведомления DLL об определенных важных событиях. Применение этой подпрограммы необязательно. Однако, для того чтобы DLL ее реализовала, компоновщику потребуется предоставить имя функции в качестве точки входа запуска библиотеки. Имя DLLEntryPoint служит просто заполнителем. Стандартное имя точки входа — DLLMain. Если DLL содержит функцию DLLMain, нет надобности указывать точку входа во время компоновки. Тем не менее, во время компоновки Windows будет вызывать любые функции, определенные в качестве точек входа библиотеки, если их имена отличаются от DLLMain. |
|||||||
Синтаксис |
BOOL DLLEntryPoint( HINSTANCE MnstDLL, DWORD dwNotification, LPVOID IpReserved ) |
|||||||
Параметры |
||||||||
HlnstDLL |
HINSTANCE: Дескриптор экземпляра собственно DLL. |
|||||||
DwNotificatio* |
DWORD: Код уведомления. Список допустимых кодов уведомления, которые могут отправляться системой Windows, представлен в табл. 30.2. |
|||||||
LpReserved |
LPVOID: Зарезервирован; установлен в значение NULL. |
|||||||
Таблица 30.2 Коды уведомления DLL |
||||||||
Кол увеломления |
Описание |
|||||||
DLL_PROCESS_ATTACH |
Информирует DLL о присоединении нового процесса. Уведомление DLL THREAD_ATTACH не генерируется для потоков, которые в данный момент существуют внутри процесса, включая исходный. |
|||||||
DLL_PROCESS_DETACH |
Информирует DLL, что взаимодействие выполняемого процесса с DLL завершено в результате завершения процесса либо из-за того, что процесс удалил библиотеку из памяти. |
|||||||
DLL_THREAD_ATTACH |
Информирует DLL о создании нового потока процессом, который присоединен к DLL. |
|||||||
DLL_THREAD_DETACH |
Информирует DLL о завершении выполняемого потока. |
|||||||
Возвращаемое значение |
BOOL: Возвращаемое значение игнорируется для всех кодов уведомления, кроме DLL_PROCESS_ATTACH. При использовании кода DLL_PROCESS_ATTACH DLL должна возвращать TRUE, если инициализация выполнилась успешно и приложение может продолжать работу. Когда DLL возвращает FALSE, приложение завершается, если оно использует динамическое связывание во время загрузки, либо получит код ошибки из функции LoadLibrary или LoadLibraryEx, если применяется динамическое связывание во время выполнения. |
|||||||
Пример |
В следующем примере показана уведомляющая точка входа DLLMain. Выполняется простое отслеживание количества присоединенных процессов и потоков. |
|||||||
См. \local-sources\chap30\30-01.txt |
||||||||
FreeLibrary • Windows 98 • Windows 2000 |
||||||||
Описание |
Приложение использует функцию FreeLibrary для информирования Windows, что оно более не нуждается в указанной DLL. Windows Декрементирует значение счетчика использований DLL Когда значение счетчика достигает нуля, DLL из памяти удаляется. |
|||||||
Синтаксис |
BOOL FreeLibrary( HMODULE hDLLibrary ) |
|||||||
Параметры HDLLibrary |
HMODULE: Дескриптор DLL. Этот дескриптор возвращает функция; LoadLibrary. |
|||||||
Возвращаемое значение |
BOOL: При успешном завершении функции возвращается TRUE, в противном случае — FALSE. Приложение может получить дополнительную информацию при помощи функции GetLastError |
|||||||
Включаемый файл |
winbase.h |
|||||||
См. также |
LoadLibrary, LoadLibraryEx |
|||||||
Пример |
Пример использования функции содержится в описании LoadLibrary. |
|||||||
FreeLibraryAndExitThread • Windows 98 • Windows 2000 |
||||||||
Описание |
Приложение использует функцию FreeLibraryAndExitThread для информирования Windows, что оно более не нуждается в указанной DLL, поэтому вызывающий поток необходимо завершить. Windows демонстрирует значение счетчика использований DLL. Когда значение счетчика достигает нуля, DLL из памяти удаляется. В заключение Windows завершает вызывающий поток. Эта функция является элементарной комбинацией функций FreeLibrary и ExitThread. Она полезна в случаях, когда вызывающий поток создается и выполняется внутри DLL. Поток не может просто вызвать функцию Free-Library, поскольку Windows может выгрузить DLL. В результате код потока станет недопустимым, прежде чем поток получит возможность восстановить управление и вызвать функцию ExitThread. |
|||||||
Синтаксис |
VOID FreeLibraryAndExitThread( HMODULE hDLLibrary )' |
|||||||
Параметры |
||||||||
HDLLibrary |
HMODULE: Дескриптор DLL. Этот дескриптор возвращает функция LoadLibrary. |
|||||||
Возвращаемое значение |
VOID: Функция значений не возвращает. |
|||||||
Включаемый файл |
winbase.h |
|||||||
См. также |
ExitThread, FreeLibrary, LoadLibrary, LoadLibraryEx |
|||||||
Пример |
Следующий пример демонстрирует использование данной функции. Предполагается, что рассмотренный ниже код содержится в загруженной DLL и использует другую DLL. При вызове функции указанная библиотека будет удалена из памяти, а вызывающий поток завершится. Если функция выполнит возврат, приложение сгенерирует неисправимую ошибку. |
|||||||
HMODULE hModule; |
||||||||
hModule = LoadLibrary ("MYDLLLIB. DLL" ); |
||||||||
FreeLibraryAndExit (hModule) ; Fa talError ("Current thread is unable to terminate."); |
||||||||
GetProcAddress • Windows 98 • Windows 2000 |
||||||||
Описание |
Функция GetProcAddress применяется для получения адреса функции, находящейся в DLL. Впоследствии приложение может использовать этот адрес для вызова функции. |
|||||||
Синтаксис |
FARPROC GetProcAddress( HMODULE hDLDbrary, LPCSTR IpszProcName ) |
|||||||
Параметры |
||||||||
HDLLibrary |
HMODULE Дескриптор DLL. Этот дескриптор возвращается функцией LoadLibrary function. |
|||||||
IpszProcName |
LPCSTR: Этот параметр может представлять собой либо указатель на завершаемую нулевым символом строку, идентифицирующую процедуру, либо порядковый номер процедуры. Если используется порядковый номер, он должен указываться в младшем слове, а старшее слово должно быть равно 0. |
|||||||
Возвращаемое значение |
FARPROC: При успешном завершении функции возвращается адрес точки входа запрашиваемой процедуры. В противном случае возвращается NULL. Приложение может получить дополнительную информацию за счет вызова функции GetLastError. |
|||||||
Включаемый |
||||||||
файл См. также |
winbase.h FreeLibrary, LoadLibrary, LoadLibraryEx |
|||||||
Пример |
Пример содержится в описании функции LoadLibrary |
|||||||
LoadLibrary • Windows 98 • Windows 2000 |
||||||||
Описание |
LoadLibrary получает дескриптор модуля DLL. Если DLL в памяти не присутствует, Windows ее загружает. Затем Windows инкрементирует счетчик использований библиотеки и возвращает дескриптор модуля, который идентифицирует библиотеку. |
|||||||
Синтаксис |
HANDLE LoadLibrary( LPCTSTR IpszLibraryName ) |
|||||||
Параметры |
||||||||
LpszLibraryName |
p LPCTSTR Указывает на завершаемую нулевым символом строку, которая определяет имя файла загружаемого модуля. Этот модуль может представлять собой DLL либо исполняемый файл. Если расширение файла не указано, принимается .DLL. Если не указан путь, Windows выполняет поиск DLL в следующем порядке: в каталоге, из которого было загружено вызывающее приложение, в текущем каталоге, каталоге Windows\System, каталоге Windows и, наконец, во всех каталогах, которые хранит переменная среды PATH. |
|||||||
Возвращаемое значение |
HANDLE: При успешном завершении функции возвращается дескриптор модуля загруженной библиотеки. В противном случае возвращается NULL. Приложение может получать дополнительную информацию за счет вызова функции GetLastError. |
|||||||
Включаемый файл |
winbase.h |
|||||||
См. также |
FreeLibrary, FindResource, GetProcAddress, LoadLibraryEx, Load Resource |
|||||||
Пример |
В следующем примере загружается библиотека GDI32.DLL и при помощи функции GetProcAddress получается адрес подпрограмм BeginPath, End Path и StrokePath. В предыдущих версиях Windows NT этих подпрограмм нет. Если ссылки на подпрограммы будут выполняться путем динамического связывания во время загрузки, приложение не будет загружаться в тех вер--сиях Windows NT, где эти функции недоступны. В случае применения ди-. намического связывания во время выполнения приложение может продолжать обычное выполнение даже при отсутствии функций работы с путями. |
|||||||
См. \local-sources\chap30\30-02. txt |
||||||||
LoadLibraryEx • Windows 98 • Windows 2000 |
||||||||
Описание |
Функция LoadLibraryEx получает дескриптор модуля DLL с опцией зап-, рета уведомления DLLEntryPoint. Если DLL в памяти не присутствует, Windows ее загружает. Затем Windows инкрементирует счетчик использований библиотеки и возвращает дескриптор модуля, который идентифицирует библиотеку. |
|||||||
Синтаксис |
HANDLE LoadLibraryEx( LPCTSTR IpszLibraryName, HANDLE hReserved, DWORD dwFlags ) |
|||||||
Параметры |
||||||||
LpszLibraryNamt |
LPCTSTR: Указывает на завершаемую нулевым символом строку, которая задает имя файла загружаемого модуля. Этот модуль может представлять собой DLL либо исполняемый файл. Если расширение файла не указано, принимается .DLL Если не указан путь, Windows выполняет поиск DLL в следующем порядке: в каталоге, из которого было загружено вызывающее приложение, в текущем каталоге, каталоге Windows\System, каталоге Windows и, наконец, во всех каталогах, хранящихся в переменной среды PATH. |
|||||||
HReserved |
HANDLE: Зарезервирован; должен быть равен NULL. |
|||||||
DwFlags |
DWORD: Может принимать одно из значений, перечисленных в табл. 30.3. Если установлено значение 0, функция будет идентичной LoadUbrary. |
|||||||
Таблица 30.3 Значения параметра dwFlags функции LoadLibraryEx |
||||||||
Флаг |
Значение |
|||||||
DON'T_RESOLVE_DLL_REFERENCES |
Система не вызывает DIIMain для инициализации процессов и потоков. Кроме того, система не загружает дополнительные выполняемые модули, на которые ссылается указанный модуль. |
|||||||
LOAD_LIBRARY_AS_DATAFILE |
Система отображает файл в виртуальном адресном пространстве вызывающего процесса, как если бы это был файл данных. Для запуска или подготовки к запуску отображенного файла ничего не предпринимается. Этот флаг используется для извлечения сообщений или ресурсов из библиотеки. |
|||||||
LOAD_WITH_ALTERED_SEARCH_PATH |
Система использует, альтернативную стратегию просмотра файлов для поиска связанных исполняемых модулей, загрузку которых вызывает указанный модуль. При этом в первую очередь просматривается каталог, путь которого указан в имени модуля. |
|||||||
Возвращаемое значение |
HANDLE: При успешном завершении функции возвращается дескриптор модуля загруженной библиотеки. В противном случае возвращается NULL. Приложение может получить дополнительную информацию за счет обращения к функции GetLastError. |
|||||||
Включаемый файл |
winbase.h |
|||||||
См. также |
FreeLibrary, FindResource, GetProcAddress, Load Resource |
|||||||
Пример |
В следующем примере приложение загружает DLL в память, получает адрес процедуры из библиотеки, вызывает функцию из DLL и, наконец, удаляет библиотеку из памяти. Обратите внимание, что в коде Windows не генерирует вызовы подпрограммы DLLMain из DLL. |
|||||||
СИ \loc*l-*ources\chap30\30-03 . txt |
||||||||
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.