Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Windows Cosa sono le DLL

Cosa sono le DLL

E-mail Stampa PDF

Dynamic Link Library

Basta aprire la cartella Windows/System per trovare una lista apparentemente infinita di file con estensione .DLL ed il loro numero aumenta ad ogni nuova installazione.
Molti problemi di conflitti Software dipende da loro e una discreta parte del registro di configurazione si occupa della loro gestione.
Ma cosa sono le DLL?

Partiamo dall'inizio...

Una volta i programmi erano contenuti quasi per intero in un unico file .EXE di dimensioni abbastanza elevate. Ogni aggiornamento del programma comportava la sostituzione del file eseguibile ed ogni nuova funzione ne aumentava ulteriormente le dimensioni. Ogni programma portava nella propria cartella tutti i file necessari per l'accesso ai dati, l'interfaccia grafica, ecc.

Presto ci si è resi conto che tanti file (o comunque tante funzioni contenute nei file) risultavano duplicate più volte all'interno delle varie cartelle e questa consapevolezza ha portato alla creazione delle Librerie.

Le Librerie sono file con estensione .DLL che contengono funzioni condivise da tutti i programmi evitando una ridondanza di codice. In questo modo si avranno, ad esempio, le DLL COMCTL32.DLL (toolbars, contenitori di testo, barre di scorrimento, ecc), MAPI32.DLL (che contiene le funzioni di posta) o SHELL32.DLL (contiene la maggior parte delle icone di windows) installate nella cartella di sistema di Windows ed a disposizione di ogni programma.

Un altro vantaggio dell'utilizzo delle librerie è la semplificazione degli aggiornamenti. Ad esempio, un programma gestionale Gest.Exe potrà avere una Libreria Data.Dll che si occupa dell'accesso al DataBase (Inserimenti, Modifiche, Cancellazioni e Ricerche) tramite ODBC.

Se un Domani il gestore vorrà cambiare tecnologia di accesso ai dati sarà sufficiente creare un nuovo file con lo stesso nome e con la stessa interfaccia verso l'esterno che vada a sostituire Data.Dll senza che il resto del programma subisca modifiche.

Questo vale per ogni programma che gira sotto Windows, SO compreso.

Tipi di Librerie

Tecnicamente una Dynamic Link Library (DLL) è un file compilato che contiene una serie di funzioni che possono essere utilizzate da qualsiasi altro Processo Server e non è detto che debba avere l'estensione .DLL; anche gli EXE hanno questa potenzialità così come i driver dei dispositivi di Windows non sono altro che Librerie con estensione .DRV. Inoltre, essendo compilate, sono completamente indipendenti dal linguaggio in cui sono state scritte. Questo permette ad un programmatore Visual Basic di sfruttare Librerie scritte in C++ o viceversa. Tuttavia esistono varie tipologie di librerie con caratteristiche molto diverse.

Prima di tutto è necessario differenziare le Librerie Standard dalle Librerie COM.
Quando si utilizzano le prime si eseguono chiamate dirette alle funzioni API (Application Programming Interface) di windows. Le seconde, invece, hanno un interfaccia COM (Component Object Model), che permette di comunicare coi loro componenti tramite un'architettura Software e una Libreria dei Tipi, che permette l'utilizzo di funzioni come Object Browser e Auto List Members a livello di programmazione. Proprio queste funzioni fanno si che questo tipo di Librerie venga utilizzato per la maggiore dai programmatori. A livello di prestazioni le Librerie Standard sono più veloci mentre le Librerie COM garantiscono una miglior gestione degli errori (evitando il più possibile le famose schermate Blu).

Un'altra classificazione va fatta tra i file .DLL e quelli .EXE.
Le DLL lavorano sempre nello spazio d'indirizzamento del processo chiamante (in-process) e non possono funzionare in un proprio task. Un file eseguibile in genere può essere utilizzato sia come libreria che come programma a se stante e lavora sempre in un proprio processo. L'utilizzo di librerie .EXE è più lento perché il passaggio dei dati tra un processo ed un altro (Marshaling) richiede più tempo e più risorse. Lo svantaggio delle DLL è che in caso di un loro blocco l'intero processo viene bloccato compreso quindi il programma chiamante. [MARSHALING: E' l'operazione che utilizza COM ogni volta che deve comunicare con un server out-of-process.]

Un'ultima differenziazione va fatta tra i file .DLL e gli .OCX.
Entrambi i tipi di file lavorano allo stesso modo ma i secondi forniscono oltre alle funzioni anche una propria interfaccia grafica. Gli Ocx sono detti anche ActiveX.

Esistono infine altre particolari Librerie che contengono l'elenco delle Proprietà, degli Eventi e dei Metodi dei componenti COM; sono dette Dei Tipi e possono essere .EXE, .DLL, .OLB, .TLB, .OCX.

API e DLL

Si è accennato in precedenza alle API. L'API di Win32 è costituita da un gruppo di DLL Standard che fornisco funzioni a basso livello al Sistema Operativo.

Eccone alcune:
KERNEL32.DLL funzioni operative di basso livello. (gestione della memoria, dei task, delle risorse e operazioni correlate)
USER32.DLLFunzioni relative alla gestione di Windows (messaggi, menu, cursori, timer, caret, comunicazioni e la maggior parte delle altre funzioni che non riguardano la visualizzazione.
GDI32.DLLFunzioni che hanno a che fare con l'output dei dispositivi
COMDLG.DLL, LZ32.DLL, VERSION.DLLSupporto per le finestre di dialogo comuni, la compressione dei file e il controllo della versione. In alcuni casi sono accessibili direttamente in altri è necessario ricorrere alla APIGID32.DLL
APIGID32.DLLFornisce a VB l'interfaccia ad alcune funzioni non compatibili
ODBC32.DLLUna delle DLL che implementano l'Open Database Connectivy). Queste funzioni forniscono un API standard per diversi tipi di DataBase.
COMCTL32.DLLImplementa il nuovo gruppo di controlli delle finestre (elenco ad albero, ecc.)
MAPI32.DLLForniscono le API che permettono a qualsiasi applicazione di operare sulla posta elettronica.
NETAPI.DLLFunzioni di accesso e controllo delle reti.
WINMM.DLLFunzionalità multimediali di un sistema.

REGISTRAZIONE DI UNA LIBRERIA

Si diceva che ogni installazione aggiunge Librerie al S.O. ed il kit di installazione effettua delle modifiche al Registry per ogni nuovo componente.
Nel caso in cui ci sia la necessità di registrare manualmente un libreria usare l'utilità REGSVR32.EXE.
Il programma è contenuto in C:WINDOWSSYSTEM e può essere eseguito da DOS o da Esegui di Windows

Per registrare un componente Regsvr32.exe c:provanomefle.dll

Per deregistrarlo Regsvr32.exe c:provanomefle.dll /u

I componenti EXE si registrano automaticamente alla loro prima esecuzione.
Se è necessario che la libreria si registri e si chiuda automaticamente allora è necessario aggiungere /regserver (/unregserver lo deregistra).

MODIFICHE NEL REGISTRY DEGLI OGGETTI OLE

La tecnologia OLE permette di incapsulare Oggetti creati da un'applicazione all'interno di documenti prodotti da un'altra (ad esempio avere un foglio di Excel [che fa da control] in un documento di Word [che fa da container]).
Per capire quali modifiche apporta al registry l'installazione di un oggetto Ole è importante vedere in che modo vengono utilizzate.

Il container cerca nel Registro sotto HKCR la classe che deve utilizzare.
Esempio: MSGraph.Chart
questa chiave ha 2 sottochiavi CURVER e CLSID.
La prima contiene un valore di testo che mostra la Versione.
La seconda mostra un valore esadecimale 8+4+4+12 (es. {932000EE-8140-11D2-0080C8FF2183}).

Tramite questo codice vengono trovati sotto HKCRCLSID le informazioni necessarie all'utilizzo (alcuni EXE hanno il CLSID dei server che utilizzano, soprattutto se installati con loro, già memorizzati e quindi evitano la prima fase).

Le informazioni sono:
LocalServer32 (nel Valore (predefinito)): rappresenta il percorso del file EXE che fornisce il componente (se è un EXE).
InProcServer32 (nel Valore (predefinito)): rappresenta il percorso del file .DLL che fornisce il componente (se è una DLL).
Nel caso delle DLL c'è anche un Valore Threading Model che può avere a sua volta 2 valori principali: Apartment e Free.

Multithreading: è la capacità di eseguire differenti parti di codice di un'applicazione
(esempio di Word che durante la digitazione un thread si occupa dell'impaginazione ed un altro thread della correzione).
Il multithreading viene sfruttato a fondo in sistemi con più processori ma nel caso di una singola CPU non rappresenta sempre un vantaggio. Il Valore Free indica che ciascun thread può accedere all'intera area dati del processo. Nel caso del Valore Apartment ogni thread viene incapsulato in un "appartamento" a se stante senza poter accedere all'area dati degli altri thread.

COME TROVA WINDOWS UNA DLL?

All'avvio di ogni programma vengono caricate tutte le librerie (DLL, EXE, OCX, ecc.) di cui il software ha bisogno. Il processo di ricerca e caricamento di una DLL in Win 9X utilizza un preciso ordine di ricerca:

1. Directory da cui è stata caricata l'applicazione.

2. Directory corrente.

3. Directory di sistema di windows (WindowsSystem).
Usa la funzione GetSystemDirectory (contenuta in Kernel32.dll) per localizzare la cartella.
[nel caso di windows Nt/2000 il punto 3 viene modificato:
3a. Directory di sistema 32-bit (WindowsSystem32)
3b. Directory di sistema 16-bit (WindowsSystem)]

4. Directory di Windows (Windows).
Usa la funzione GetWindowsDirectory (kernel32.dll)

5. Nelle directory del PATH.
PATH E' quello impostato nella cartella Hkey_Local_MachineSOFTWAREMicrosoft
WindowsCurrentVersionAppPath
.

Questa chiave ha una serie di sottocartelle che rappresentano le varie applicazioni installate.
All'interno della cartella c'è una chiave PATH che sta ad indicare il Path specifico dell'applicazione.

L'ordine viene modificato se:

1. il nome della DLL è passato a Load Library specificando la posizione (path).
(Ad esempio i Riferimenti di Office)

2. la DLL a 32 bit ha una stringa di valore col suo nome (esclusa l'estensione) in KnowDlls.
(HKEY_LOCAL_MACHINESYSTEMCURRENTCONTROLSETCONTROL
SESSIONMANAGERKNOWDDLS)


[Nel caso in cui il file venga segnalato da KnowDlls la sua ricerca parte immediatamente dalla cartella di sistema WindowsSystem. Se non viene trovato in quella posizione il sistema restituisce immediatamente un errore "THE SYSTEM CANNOT FIND THE FILE SPECIFIED" senza proseguire la ricerca in altre cartelle].

ESEMPIO DI "KNOW DLLS"

1) Si esegue l'applicazione Word 2000.

Tramite un visualizzatore di processi si vede che vengono utilizzate una serie di DLL tra cui C:ProgrammiMicrosoft OfficeOfficeMSO9.dll.

3) Se però si aggiunge alla chiave KNOWDDLS un dato MSO9 con valore MSO9.DLL.

4) Al prossimo avvio di Word il file verrà cercato in WindowsSystem. Se il file non è presente in quella precisa cartella allora vengono generati 2 messaggi di errore in cascata. Da notare che il file è ancora presente nella cartella da cui è stata lanciata l'applicazione.

5) Basterà copiare il file nella directory di sistema perché venga utilizzato da lì.

CONDIVISIONE DELLE DLL

Come si è ripetuto più volte uno dei vantaggi delle Librerie è la condivisione delle loro funzioni con un conseguente risparmio di codice. Questo vantaggio comporta però un'importante problematica: quando una disinstallazione può rimuovere un libreria condivisa da più programmi?

La risposta si trova, come spesso accade, nel Registry di Windows nella chiave:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionSharedDlls

Tutte le librerie condivise che vengono installate sulla macchina vengono inserite in questa chiave e viene dato loro un valore che funge da contatore. Ogni volta che viene installato/rimossa un'applicazione che sfrutta quella determinata DLL il suo contatore viene incrementato/decrementato.

Quando un programma viene rimosso controlla il valore di questa chiave per saper se il file .Dll che aveva precedentemente installato è utilizzate da altri software.

Se il contatore è a 0 viene proposta l'eliminazione.

 

ALCUNE DLL

Ecco un lista di alcune delle Librerie più utilizzate e la loro descrizione:

Filename
Version
Description
Msvcrt.dll
6.00.8337
Run-Time di Visual C++
Oleaut32.dll
2.30.4265
Parte di OLE-AUT che complementa Microsoft Foundation Classes (MFC) and Visual Basic run-time.
Olepro32.dll
5.00.4265
Parte di OLE-AUT che complementa MFC e Visual Basic run-time.
Asycfilt.dll
2.30.4265
Parte di OLE-AUT che complementa MFC e Visual Basic run-time.
Stdole2.tlb
2.30.4265
Parte di OLE-AUT che complementa MFC e Visual Basic run-time.
Mfc42.dll
6.00.8267
Microsoft Foundation Class (MFC), Dipendente da Msvcrt.dll, ComCtl32.dll, e OLE-AUT files.
Mfc42u.dll
6.00.8267
MFC Unicode solo per Windows Nt
Regsvr32.exe  Eseguibile per registrare le Dll.
RegTlib.exe  Eseguibile per registrare I file .Tlb

 

CONCLUSIONI

Le Librerie Dinamiche sono una parte fondamentale del sistema Windows. Hanno grandi potenzialità ma dal punto di vista del risparmio di codice e degli aggiornamenti.
In via teorica, come si diceva all'inizio, è possibile rivoluzionare, aggiornare o "aggiustare" un intero programma sostituendo una semplice Dll.

Purtroppo la realtà è un po' diversa: la maggior parte delle Librerie sono situate nella cartella WindowsSystem e sono condivise da più programmi e questo provoca spesso problemi di compatibilità.

Facciamo un esempio:

il Computer ha già installato una libreria Correttore.Dll. Il programma di videoscrittura Write, all'installazione, sovrascrive il file con una sua versione più recente che comprende una particolare funzione aggiuntiva TrovaSinonimi.

A questo punto il primo dei due programmi installati non funzionerà correttamente perché l'installazione del secondo avrà sostituito la libreria Correttore.Dll.

Questo è uno dei principali problemi di compatibilità tra i software.

Altri problemi si verificano nel "pericoloso" Registro di Configurazione ma l'incognita più forte sta proprio nel contenuto di queste librerie.

Ne esistono a centinaia ed ognuna di esse contiene decine di funzioni. La documentazione che indichi le dipendenze tra i vari file e quali funzioni contengano scarseggia e questo obbligherà sempre più spesso a formattare o reistallare programmi al primo messaggio di errore o addirittura impedirà all'utente di far convivere sulla propria macchina applicazioni che entrano in conflitto.