Явное связывание

Явное связывание, или связывание во время выполнения, несколько сложнее и требует от программы специального запроса для загрузки библиотеки (функция LoadLibrary) или ее вы­грузки (функция FreeLibrary). Затем программа получает адрес нужной точки входа и использует его как указатель в вызове функции. В вызывающей программе функция не объявляется; вместо этого необходимо объявить переменную как указатель на функцию. Поэтому при компоновке программы нет потребности в файле библиотеки. Необходимы три функции: LoadLibrary, GetProcAddress и FreeLibrary.

HINSTANCE LoadLibrary (LPCTSTR lpLibFileName);

Возвращаемый дескриптор (типа hinstance, а не handle) не примет значения NULL в случае неудачи. Расширение.DLL в имени файла не требуется. С помощью функции LoadLibrary можно загрузить и файл типа.ЕХЕ. Так как динамические библиотеки разделяемые, система ведет учет ссылок на каждую DLL (их число увели­чивается при вызове функции LoadLibrary), поэтому не требуется отображения фак­тически существующего файла. Даже если файл DLL найден, функция LoadLibrary выполнится неудачно в случае, если библиотека неявно связана с другой библиоте­кой, которая не может быть найдена.

Аналогичная функция LoadLibraryEx имеет несколько флагов, используемых для указания альтернативных путей поиска и загрузки библиотеки как файла данных.

После работы с данным экземпляром или для загрузки его другой версии необхо­димо освободить дескриптор библиотеки, освобождая тем самым ресурсы, включая и виртуальное адресное пространство, занятое библиотекой. Если счетчик ссылок ука­зывает на то, что библиотека используется другим процессом, она остается загружен­ной в память:

BOOL FreeLibrary (HINSTANCE hLibModule);

После загрузки динамической библиотеки и до ее выгрузки можно получить адре­са точек входа с использованием функции GetProcAddress.

FARPROC GetProcAddress (HMODULE module, LPCSTR lpProcName);

Параметр hModule, несмотря на другой тип (тип hinstance определен как hmodule), является экземпляром, получаемым от функций LoadLibrary или GetModuleHandle, которые здесь не описаны. Параметр lpProcName, который не может быть строкой стандарта Unicode, является именем точки входа. В случае неуда­чи возвращаемое функцией значение будет null.

Используя функцию GetModuleFileName, можно получить имя файла, связанного с дескриптором hModule. И наоборот, по заданному имени файла (файл типа.ехе или.dll) функция GetModuleHandle возвращает дескриптор, связанный с файлом, если тот был загружен текущим процессом.

Функция входа в библиотеку также выполняется при создании или завершении процессом новых потоков.

Ниже приводится пример программы преобразования файла из формата ASCII в формат Unicode, используя создание библиотеки с неявным связыванием.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: