Явное связывание, или связывание во время выполнения, несколько сложнее и требует от программы специального запроса для загрузки библиотеки (функция 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, используя создание библиотеки с неявным связыванием.