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 funzione di libreria in ogni modulo che lo chiama.
Tipi di collegamento dinamico
Esistono due metodi per chiamare una funzione in una DLL:
- In collegamento dinamico in fase di caricamento, un modulo effettua chiamate esplicite alle funzioni DLL esportate come se fossero funzioni locali. È quindi necessario 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 al caricamento dell'applicazione.
- In 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 a funzione restituiti da GetProcAddress. In questo modo si elimina la necessità di una libreria di importazione.
DLL e gestione della memoria
Ogni processo che carica la DLL ne esegue il mapping nello spazio indirizzi virtuale. Dopo che il processo carica la DLL nell'indirizzo virtuale, può chiamare le funzioni DLL esportate.
Il sistema gestisce un conteggio dei 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, si applicano le condizioni seguenti:
- I thread del processo che ha chiamato la DLL possono usare gli handle aperti da una funzione della DLL. Analogamente, gli handle aperti da qualsiasi thread del processo chiamante possono essere usati nella funzione DLL.
- La DLL usa lo stack del thread chiamante e lo spazio degli indirizzi virtuali del processo chiamante.
- La DLL alloca memoria dallo spazio indirizzi virtuale del processo chiamante.
Per altre informazioni sulle DLL, vedere gli argomenti seguenti:
- vantaggi del collegamento dinamico
- Dynamic-Link Creazione della Libreria
- Dynamic-Link della libreria Entry-Point
- Load-Time collegamento dinamico
- Run-Time collegamento dinamico
- Dynamic-Link Ordine di ricerca della libreria
- Dynamic-Link dati della libreria
- Dynamic-Link reindirizzamento della libreria
- Dynamic-Link Aggiornamenti della libreria
- Dynamic-Link Libreria di Sicurezza
- AppInit DLL e Secure Boot