Перед вами
очередной выпуск рассылки "Программирование на WinApi" Переводы многих функций Win32API, которые часто используются
в данной рассылке, вы можете получать, подписавшись на дружественную
рассылку "WinAPI на
русском". Справочник по функциям Win32API вы
можете посмотреть на сайте BcbDev.ru в разделе MSDN
по-русски.
Использование
динамического связывания во время
выполнения
Вы можете использовать ту же DLL
как во время загрузки, так и во время выполнения. Следующий исходный текст
производит тот же вывод, что и пример времени загрузки в предыдущей
статье. Приложение использует функцию
LoadLibrary чтобы получить дескриптор MYPUTS.DLL. Если
LoadLibrary выполняется без ошибок, приложение использует
возвращенный дескриптор в функции GetProcAddress
чтобы получить адрес функции myPuts. После вызова функции DLL, программа
вызывает функцию FreeLibrary, чтобы выгрузить DLL.
Следующий пример иллюстрирует важное различие между динамическим
связыванием во время загрузки и времени выполнения. Если файл
MYPUTS.DLL - не доступен, приложение, использующее динамическое
связывание во время загрузки просто завершается. Однако пример динамического связывания во время
выполнения может ответить на ошибку. (MSDN: Using Run-Time Dynamic
Linking)
// File: RUNTIME.C
// Простая программа использующая LoadLibrary и
// GetProcAddress для доступа к myPuts в MYPUTS.DLL.
#include <stdio.h>
#include <windows.h>
typedef VOID (*MYPROC)(LPTSTR);
VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Получаем дескриптор модуля DLL.
hinstLib = LoadLibrary("myputs");
// Если дескриптор имеет силу, пытаемся получить адрес функции.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// Если адрес функции имеет силу, вызываем эту функцию.
if (fRunTimeLinkSuccess = (ProcAdd != NULL))
(ProcAdd) ("message via DLL function\n");
// Выгружаем модуль DLL.
fFreeResult = FreeLibrary(hinstLib);
}
// Если не удалось вызвать функцию DLL, используем альтернативный вариант.
if (! fRunTimeLinkSuccess)
printf("сообщение, используя альтернативный метод\n");
}
Поскольку программа использует динамическое связывание во время выполнения, Вы не должны линковать библиотеку импорта при создании модуля программы.