Condividi tramite


collegamento dinamico Run-Time

Quando l'applicazione chiama le funzioni LoadLibrary o LoadLibraryEx , il sistema tenta di individuare la DLL . Per informazioni dettagliate, vedere Ordine di ricerca della libreria a collegamento dinamico. 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 come la stessa DLL.Note that two DLL that have the same base file name and extension but are found in different directories are not consider to the same 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, FreeLibrary o FreeLibraryAndExitThread .

La funzione GetModuleHandle restituisce un handle utilizzato in GetProcAddress, FreeLibrary o FreeLibraryAndExitThread. La funzione GetModuleHandle ha esito positivo solo se il modulo DLL è già mappato nello spazio degli indirizzi del processo collegando il tempo 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 funzione GetModuleFileName recupera il percorso completo del modulo associato a un handle restituito da GetModuleHandle, LoadLibrary o 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 numero di 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 normale percorso di ricerca. Questa situazione contrasta con il collegamento del tempo 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 funzione DllMain per eseguire l'inizializzazione per ogni thread di un processo, perché il punto di ingresso non viene chiamato per i thread esistenti prima della chiamata a LoadLibrary o LoadLibraryEx . Per un esempio che illustra come risolvere questo problema, vedere Uso dell'archiviazione locale dei thread in una libreria di Dynamic-Link.

Uso del collegamento dinamico in fase di esecuzione