Caricamento DLL statico vs dinamico con Delphi

Una DLL (Dynamic Link Library) funge da libreria condivisa di funzioni che possono essere richiamate da numerose applicazioni e altre DLL. Delphi ti permette creare e usare DLL in modo da poter chiamare queste funzioni a piacimento. Tuttavia, è necessario importare queste routine prima di poterle chiamare.

Le funzioni esportate da una DLL possono essere importate in due modi: dichiarando una procedura o funzione esterna (statica) o mediante chiamate dirette a funzioni API specifiche della DLL (dinamica).

Consideriamo una semplice DLL. Di seguito è riportato il codice per "circle.dll" che esporta una funzione, denominata "CircleArea", che calcola l'area di un cerchio utilizzando il raggio specificato:

Una volta che hai il circle.dll, puoi usare la funzione "CircleArea" esportata dalla tua applicazione.

Caricamento statico

Il modo più semplice per importare una procedura o una funzione è dichiararla utilizzando la direttiva esterna:

Se includi questa dichiarazione nella parte dell'interfaccia di un'unità, circle.dll viene caricato una volta all'avvio del programma. Durante l'esecuzione del programma, la funzione CircleArea è disponibile per tutte le unità che utilizzano l'unità in cui si trova la dichiarazione di cui sopra.

instagram viewer

Caricamento dinamico

È possibile accedere alle routine in una libreria tramite chiamate dirette alle API Win32, incluso LoadLibrary, FreeLibrary, e GetProcAddress. Queste funzioni sono dichiarate in Windows.pas.

Ecco come chiamare la funzione CircleArea usando il caricamento dinamico:

Durante l'importazione mediante caricamento dinamico, la DLL non viene caricata fino alla chiamata a LoadLibrary. La libreria viene scaricata da chiama a FreeLibrary.

Con il caricamento statico, la DLL viene caricata e le sue sezioni di inizializzazione vengono eseguite prima dell'esecuzione delle sezioni di inizializzazione dell'applicazione chiamante. Questo è invertito con caricamento dinamico.

Dovresti usare statico o dinamico?

Ecco un semplice sguardo ai vantaggi e agli svantaggi del caricamento DLL statico e dinamico:

Caricamento statico

Professionisti:

  • Più facile per uno sviluppatore principiante; no "brutto" Chiamate API.
  • Le DLL vengono caricate una sola volta, all'avvio del programma.

Contro:

  • L'applicazione non si avvierà se manca qualche DLL o non è possibile trovarla. Apparirà un messaggio di errore come questo: "Impossibile avviare questa applicazione perché" missing.dll "non è stato trovato. Reinstallare l'applicazone potrebbe risolvere questo problema". In base alla progettazione, l'ordine di ricerca DLL con collegamento statico include la directory da cui l'applicazione caricato, la directory di sistema, la directory di Windows e le directory elencate nell'ambiente PATH variabile. Si noti inoltre che l'ordine di ricerca potrebbe essere diverso per varie versioni di Windows. Aspettati sempre di avere tutte le DLL nella directory in cui si trova l'applicazione chiamante.
  • Viene utilizzata più memoria poiché tutte le DLL vengono caricate anche se non si utilizzano alcune delle funzioni

Caricamento dinamico

Professionisti:

  • Puoi eseguire il tuo programma anche quando alcune delle librerie che utilizza non sono presenti.
  • Minor consumo di memoria poiché le DLL vengono utilizzate solo quando necessario.
  • È possibile specificare il percorso completo della DLL.
  • Potrebbe essere usato per applicazioni modulari. L'applicazione espone (carica) moduli (DLL) solo "approvati" per l'utente.
  • La capacità di caricare e scaricare la libreria in modo dinamico è la base di un sistema plug-in che consente a uno sviluppatore di aggiungere funzionalità extra ai programmi.
  • Compatibilità con le versioni precedenti di Windows in cui le DLL di sistema potrebbero non supportare le stesse funzioni o essere supportate allo stesso modo. Rilevare prima la versione di Windows, quindi il collegamento dinamico in base a ciò su cui è in esecuzione l'app, ti consente di supportare di più versioni di Windows e soluzioni alternative per i sistemi operativi precedenti (o per lo meno disabilitando con grazia funzionalità che non è possibile eseguire supporto.)

Contro:

  • Richiede più codice, che non è sempre facile per uno sviluppatore principiante.
instagram story viewer