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

Вы можете использовать одну и ту же библиотеку DLL как во время загрузки, так и в динамической компоновке во время выполнения. В следующем примере функция LoadLibrary используется для получения дескриптора библиотеки Myputs DLL (см. раздел Создание простой библиотеки Dynamic-Link). Если LoadLibrary выполняется успешно, программа использует возвращенный дескриптор в функции GetProcAddress для получения адреса функции myPuts библиотеки DLL. После вызова функции DLL программа вызывает функцию FreeLibrary для выгрузки библиотеки DLL.

Так как программа использует динамическую компоновку времени выполнения, нет необходимости связывать модуль с библиотекой импорта для библиотеки DLL.

В этом примере показано важное различие между динамическим связыванием во время выполнения и нагрузки. Если библиотека DLL недоступна, приложение, использующее динамическую компоновку во время загрузки, должно просто завершить работу. Однако пример динамической компоновки во время выполнения может реагировать на ошибку.

// A simple program that uses LoadLibrary and 
// GetProcAddress to access myPuts from Myputs.dll. 
 
#include <windows.h> 
#include <stdio.h> 
 
typedef int (__cdecl *MYPROC)(LPCWSTR); 
 
int main( void ) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary(TEXT("MyPuts.dll")); 
 
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 
 
        // If the function address is valid, call the function.
 
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (L"Message sent to the DLL function\n"); 
        }
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib); 
    } 

    // If unable to call the DLL function, use an alternative.
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 

    return 0;

}

Динамическое связывание во время выполнения