Dynamic-link library: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
m tag obsoleti
Riga 20:
Quanto segue descrive la struttura ed il funzionamento di una libreria a collegamento dinamico in ambiente Windows, tuttavia i concetti espressi sono generalmente equivalenti in tutti i sistemi che permettono l'uso di librerie dinamiche.
 
Una libreria a collegamento dinamico è a tutti gli effetti un codice eseguibile. Ogni [[file eseguibile]] (EXE o DLL) dispone di un [[punto d'ingresso]] (''entry point'') invocato dal sistema operativo subito dopo il caricamento. Per una DLL il punto d'ingresso è mappato per convenzione sulla [[funzione (informatica)|funzione]] <ttcode>DllMain</ttcode> (a discrezione, comunque, del [[compilatore]]).
 
La funzione <ttcode>DllMain</ttcode>, oltre che al caricamento della DLL, viene invocata anche allo scaricamento o quando un [[Thread (informatica)|thread]] viene creato o distrutto nel [[processo (informatica)|processo]] in cui la DLL risiede.
 
A differenza di un file EXE, la DLL deve uscire dall'entry point non appena ha terminato le inizializzazioni necessarie.
Riga 28:
=== Struttura ===
 
Per semplificare, una libreria può essere pensata come una raccolta di funzioni. Ognuna di queste funzioni avrà il proprio indirizzo di base, calcolato come [[offset]] rispetto all'[[indirizzo di base]] assegnato dal sistema operativo durante il caricamento della libreria (vedi paragrafo successivo). Ciò che distingue una libreria dinamica è che queste funzioni possono essere ''esportate'', ovvero i loro nomi vengono posti in una lista in una sezione dell'eseguibile. Perciò è possibile determinare il punto di ingresso di una funzione con una ricerca testuale basata sul nome della funzione. Questa operazione è svolta dall'[[Windows API|API]] <ttcode>GetProcAddress</ttcode> che restituisce l'indirizzo della funzione il cui nome è passato come parametro.
 
=== Caricamento ===
Riga 60:
=== Collegamento ad un eseguibile ===
 
Il collegamento di un eseguibile a una libreria dinamica avviene durante l'esecuzione (a ''run time'') e avviene tramite l'API <ttcode>LoadLibrary</ttcode>, che accetta in [[input]] il nome della libreria. Ad esempio, <ttcode>LoadLibrary(_T("MyLib.dll"))</ttcode> caricherà all'interno dello spazio di memoria dell'applicazione la DLL <ttcode>MyLib.dll</ttcode>.
 
Il collegamento può essere di due tipi: esplicito o implicito.
Riga 66:
==== Collegamento esplicito ====
 
Il collegamento esplicito viene gestito direttamente dal codice del programma con l'utilizzo delle due API <ttcode>LoadLibrary</ttcode> e <ttcode>GetProcAddress</ttcode> precedentemente descritte. Se si utilizza il [[linguaggio C]] si allocherà un [[puntatore (programmazione)|puntatore]] alla funzione specificata nel quale, al momento di utilizzare la funzione richiesta, si caricherà l'indirizzo con <ttcode>GetProcAddress</ttcode>. Questa tecnica permette di gestire in modo appropriato la condizione nella quale una DLL richiesta non è presente nel sistema, ma in generale è più macchinosa perché richiede l'utilizzo ''esplicito'' delle due API. Questa tecnica è indispensabile usando alcuni linguaggi di programmazione, quali ad esempio [[Visual Basic]].
 
==== Collegamento implicito ====