Condividi tramite


Uso di Run-Time collegamento dinamico

È possibile usare la stessa DLL sia nel collegamento dinamico in fase di caricamento che in fase di esecuzione. Nell'esempio seguente viene usata la funzione LoadLibrary per ottenere un handle per la DLL Myputs . Vedere Creazione di una libreria di Dynamic-Link semplice. Se LoadLibrary ha esito positivo, il programma usa l'handle restituito nella funzione GetProcAddress per ottenere l'indirizzo della funzione myPuts della DLL. Dopo aver chiamato la funzione DLL, il programma chiama la funzione FreeLibrary per scaricare la DLL.

Poiché il programma usa il collegamento dinamico in fase di esecuzione, non è necessario collegare il modulo a una libreria di importazione per la DLL.

Questo esempio illustra una differenza importante tra il collegamento dinamico in fase di esecuzione e il collegamento dinamico in fase di caricamento. Se la DLL non è disponibile, l'applicazione che usa il collegamento dinamico in fase di caricamento deve semplicemente terminare. L'esempio di collegamento dinamico in fase di esecuzione, tuttavia, può rispondere all'errore.

// 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;

}

Collegamento dinamico in fase di esecuzione