Использование динамического связывания периода выполнения
Вы можете использовать одну и ту же 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");
}
|