Condividi tramite


Run-Time collegamento dinamico

Quando l'applicazione chiama ilLoadLibraryo funzioni LoadLibraryEx, il sistema tenta di individuare la DLL (per informazioni dettagliate, vedere Dynamic-Link Library Search Order). Se la ricerca ha esito positivo, il sistema esegue il mapping del modulo DLL nello spazio indirizzi virtuale del processo e incrementa il conteggio dei riferimenti. Se la chiamata a LoadLibrary o LoadLibraryEx specifica una DLL il cui codice è già mappato nello spazio degli indirizzi virtuali del processo chiamante, la funzione restituisce semplicemente un handle alla DLL e incrementa il conteggio dei riferimenti dll. Si noti che due DLL con lo stesso nome di file di base e la stessa estensione, ma che si trovano in directory diverse non sono considerate la stessa DLL.

Il sistema chiama la funzione del punto di ingresso nel contesto del thread che ha chiamato LoadLibrary o LoadLibraryEx. La funzione del punto di ingresso non viene chiamata se la DLL è già stata caricata dal processo tramite una chiamata a LoadLibrary o LoadLibraryEx senza alcuna chiamata corrispondente alla funzione FreeLibrary.

Se il sistema non riesce a trovare la DLL o se la funzione del punto di ingresso restituisce FALSE, LoadLibrary o LoadLibraryEx restituisce NULL. Se LoadLibrary o LoadLibraryEx ha esito positivo, restituisce un handle al modulo DLL. Il processo può usare questo handle per identificare la DLL in una chiamata alla funzione GetProcAddress, FreeLibraryo Funzione FreeLibraryAndExitThread.

La funzioneGetModuleHandlerestituisce un handle utilizzato in GetProcAddress, FreeLibraryo FreeLibraryAndExitThread. La funzione GetModuleHandle ha esito positivo solo se il modulo DLL è già mappato allo spazio degli indirizzi del processo tramite collegamento in fase di caricamento o tramite una chiamata precedente a LoadLibrary o LoadLibraryEx. A differenza di LoadLibrary o LoadLibraryEx, GetModuleHandle non incrementa il conteggio dei riferimenti del modulo. La funzioneGetModuleFileNamerecupera il percorso completo del modulo associato a un handle restituito da GetModuleHandle, LoadLibraryo LoadLibraryEx.

Il processo può usare GetProcAddress per ottenere l'indirizzo di una funzione esportata nella DLL usando un handle di modulo DLL restituito da LoadLibrary o LoadLibraryEx, GetModuleHandle.

Quando il modulo DLL non è più necessario, il processo può chiamare FreeLibrary o FreeLibraryAndExitThread. Queste funzioni decrementano il conteggio dei riferimenti del modulo e annullano il mapping del codice DLL dallo spazio degli indirizzi virtuali del processo se il conteggio dei riferimenti è zero.

Il collegamento dinamico in fase di esecuzione consente al processo di continuare l'esecuzione anche se una DLL non è disponibile. Il processo può quindi usare un metodo alternativo per raggiungere l'obiettivo. Ad esempio, se un processo non è in grado di individuare una DLL, può provare a usare un'altra o può notificare all'utente un errore. Se l'utente può fornire il percorso completo della DLL mancante, il processo può usare queste informazioni per caricare la DLL anche se non si trova nel percorso di ricerca normale. Questa situazione contrasta con il collegamento in fase di caricamento, in cui il sistema termina semplicemente il processo se non riesce a trovare la DLL.

Il collegamento dinamico in fase di esecuzione può causare problemi se la DLL usa la funzioneDllMainper eseguire l'inizializzazione per ogni thread di un processo, perché il punto di ingresso non viene chiamato per i thread esistenti prima di LoadLibrary o viene chiamato loadLibraryEx. Per un esempio che illustra come risolvere questo problema, vedere Using Thread Local Storage in a Dynamic-Link Library.

uso del collegamento dinamico in fase di esecuzione