Использование динамического связывания периода выполнения
Вы можете использовать одну и ту же DLL, динамически связывая ее и в период выполнения загрузки и в период выполнения программы. Пример ниже использует функцию LoadLibrary, чтобы получить дескриптор Myputs DLL (см. статью Создание простой динамически подключаемой библиотеки (DLL)). Если LoadLibrary завершается успешно, программа использует возвращенный дескриптор в функции GetProcAddress, чтобы получить адрес функции myPuts в DLL. После вызова этой функции DLL, программа вызывает функцию FreeLibrary, чтобы выгрузить DLL.
Поскольку программа использует динамическую связь периода выполнения, нет необходимости компоновать модуль с импортируемой библиотекой для DLL.
Этот пример иллюстрирует важное различие между динамической связью периода выполнения и выполняемую при загрузке. Если DLL не доступна, то приложение, использующее выполняемую при загрузке динамическую связь, должно просто завершиться. Однако, пример динамической связи периода выполнения, может просто отреагировать на ошибку.
// Простая программа, которая использует функции // LoadLibrary и GetProcAddress, чтобы получить // доступ к myPuts из Myputs.dll. #include <stdio.h> #include <windows.h> typedef int (*MYPROC)(LPTSTR); VOID main(VOID) { HINSTANCE hinstLib; MYPROC ProcAdd; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; // Получим дескриптор модуля DLL. hinstLib = LoadLibrary(TEXT("myputs")); // Если дескриптор допустимый, то попробуем получить // адрес функции. if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("myPuts")); // Если адрес функции правильный, то вызываем функцию. if (NULL != ProcAdd) { fRunTimeLinkSuccess = TRUE; (ProcAdd) (TEXT("Message via DLL function\n")); } // Освобождаем модуль DLL. fFreeResult = FreeLibrary(hinstLib); } // Если вы не в состоянии вызывать функцию DLL, // используйте альтернативу. if (! fRunTimeLinkSuccess) printf("Message via alternative method\n"); } |