Использование динамического связывания периода выполнения


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

 

Назад в оглавление
На главную страницу

Hosted by uCoz