Condividi tramite


Informazioni sulle librerie Dynamic-Link

Il collegamento dinamico consente a un modulo di includere solo le informazioni necessarie per individuare una funzione DLL esportata in fase di caricamento o in fase di esecuzione. Il collegamento dinamico differisce dal collegamento statico più familiare, in cui il linker copia il codice di una libreria in ogni modulo che lo chiama.

Tipi di collegamento dinamico

Esistono due metodi per chiamare una funzione in una DLL:

  • Nel collegamento dinamico in fase di caricamento, un modulo effettua chiamate esplicite alle funzioni DLL esportate come se fossero funzioni locali. Ciò richiede di collegare il modulo alla libreria di importazione per la DLL che contiene le funzioni. Una libreria di importazione fornisce al sistema le informazioni necessarie per caricare la DLL e individuare le funzioni DLL esportate quando l'applicazione viene caricata.
  • Nel collegamento dinamico in fase di esecuzione, un modulo usa la funzione LoadLibrary o LoadLibraryEx per caricare la DLL in fase di esecuzione. Dopo il caricamento della DLL, il modulo chiama la funzione GetProcAddress per ottenere gli indirizzi delle funzioni DLL esportate. Il modulo chiama le funzioni DLL esportate usando i puntatori di funzione restituiti da GetProcAddress. Ciò elimina la necessità di una libreria di importazione.

DLL e gestione della memoria

Ogni processo che carica la DLL lo esegue nel relativo spazio indirizzi virtuale. Dopo che il processo carica la DLL nell'indirizzo virtuale, può chiamare le funzioni DLL esportate.

Il sistema gestisce un numero di riferimenti per processo per ogni DLL. Quando un thread carica la DLL, il conteggio dei riferimenti viene incrementato di uno. Quando il processo termina o quando il conteggio dei riferimenti diventa zero (solo collegamento dinamico di runtime), la DLL viene scaricata dallo spazio indirizzi virtuale del processo.

Come qualsiasi altra funzione, una funzione DLL esportata viene eseguita nel contesto del thread che lo chiama. Di conseguenza, le condizioni seguenti si applicano:

  • I thread del processo denominato DLL possono usare handle aperti da una funzione DLL. Analogamente, gli handle aperti da qualsiasi thread del processo di chiamata possono essere usati nella funzione DLL.
  • La DLL usa lo stack del thread chiamante e lo spazio indirizzi virtuale del processo di chiamata.
  • La DLL alloca la memoria dallo spazio indirizzi virtuale del processo di chiamata.

Per altre informazioni sulle DLL, vedere gli argomenti seguenti: