Динамически компонуемые библиотеки, страница 3

Наконец, 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