Creare DLL C/C++ in Visual Studio

In Windows, una libreria a collegamento dinamico (DLL) è un tipo di file eseguibile che funge da libreria condivisa di funzioni e risorse. Il collegamento dinamico è una funzionalità del sistema operativo. Consente a un eseguibile di chiamare funzioni o di usare risorse archiviate in un file separato. Queste funzioni e risorse possono essere compilate e distribuite separatamente dagli eseguibili che le usano.

Una DLL non è un eseguibile autonomo. Le DLL vengono eseguite nel contesto delle applicazioni che le chiamano. Il sistema operativo carica la DLL nello spazio di memoria di un'applicazione. Viene eseguita quando l'applicazione viene caricata (collegamento implicito) o su richiesta in fase di esecuzione (collegamento esplicito). Le DLL semplificano anche la condivisione di funzioni e risorse tra eseguibili. Più applicazioni possono accedere contemporaneamente al contenuto di un'unica copia di una DLL in memoria.

Differenze tra collegamento dinamico e collegamento statico

Il collegamento statico copia tutto il codice oggetto in una libreria statica nei file eseguibili che lo usano quando vengono compilati. Il collegamento dinamico include solo le informazioni necessarie per Windows in fase di esecuzione per individuare e caricare la DLL che contiene un elemento o una funzione di dati. Quando si crea una DLL, si crea anche una libreria di importazione che contiene queste informazioni. Quando si compila un eseguibile che chiama la DLL, il linker usa i simboli esportati nella libreria di importazione per archiviare queste informazioni per il caricatore di Windows. Quando il caricatore carica una DLL, la DLL viene mappata nello spazio di memoria dell'applicazione. Se presente, viene chiamata una funzione speciale nella DLL DllMainper eseguire qualsiasi inizializzazione richiesta dalla DLL.

Differenze tra applicazioni e DLL

Anche se le DLL e le applicazioni sono entrambi moduli eseguibili, differiscono in diversi modi. La differenza più ovvia è che non è possibile eseguire una DLL. Dal punto di vista del sistema, esistono due differenze fondamentali tra applicazioni e DLL:

  • Un'applicazione può avere più istanze di se stesso in esecuzione nel sistema contemporaneamente. Una DLL può avere una sola istanza.

  • Un'applicazione può essere caricata come processo. Può essere proprietario di elementi come uno stack, thread di esecuzione, memoria globale, handle di file e una coda di messaggi. Una DLL non può possedere queste cose.

Vantaggi dell'uso delle DLL

Il collegamento dinamico al codice e alle risorse offre diversi vantaggi rispetto al collegamento statico:

  • Il collegamento dinamico consente di risparmiare memoria e di ridurre lo scambio. Molti processi possono usare una DLL contemporaneamente, condividendo una singola copia delle parti di sola lettura di una DLL in memoria. Al contrario, ogni applicazione compilata usando una libreria collegata in modo statico ha una copia completa del codice di libreria che Windows deve caricare in memoria.

  • Il collegamento dinamico consente di risparmiare spazio su disco e larghezza di banda. Molte applicazioni possono condividere una singola copia della DLL su disco. Al contrario, ogni applicazione compilata usando una libreria di collegamenti statici include il codice della libreria collegato all'immagine eseguibile. Che usa più spazio su disco e richiede più larghezza di banda per il trasferimento.

  • La manutenzione, le correzioni di sicurezza e gli aggiornamenti possono essere più semplici. Quando le applicazioni usano funzioni comuni in una DLL, è possibile implementare correzioni di bug e distribuire gli aggiornamenti alla DLL. Quando le DLL vengono aggiornate, le applicazioni che le usano non devono essere ricompilate o ricollegate. Possono usare la nuova DLL non appena viene distribuita. Al contrario, quando si apportano correzioni nel codice oggetto collegato in modo statico, è necessario ricollegare e ridistribuire ogni applicazione che lo usa.

  • È possibile usare le DLL per fornire supporto after-market. Ad esempio, una DLL del driver di visualizzazione può essere modificata per supportare un display che non era disponibile quando l'applicazione è stata spedita.

  • È possibile usare il collegamento esplicito per individuare e caricare DLL in fase di esecuzione. Ad esempio, le estensioni dell'applicazione che aggiungono nuove funzionalità all'app senza ricompilarla o ridistribuirla.

  • Il collegamento dinamico semplifica il supporto delle applicazioni scritte in linguaggi di programmazione diversi. I programmi scritti in linguaggi di programmazione diversi possono chiamare la stessa funzione DLL purché i programmi seguano la convenzione di chiamata della funzione. I programmi e la funzione DLL devono essere compatibili nei modi seguenti: l'ordine in cui la funzione prevede il push degli argomenti nello stack. Se la funzione o l'applicazione è responsabile della pulizia dello stack. E, indipendentemente dal fatto che vengano passati argomenti nei registri.

  • Il collegamento dinamico fornisce un meccanismo per estendere le classi MFC (Microsoft Foundation Class Library). È possibile derivare classi dalle classi MFC esistenti e inserirle in una DLL di estensione MFC da usare dalle applicazioni MFC.

  • Il collegamento dinamico semplifica la creazione di versioni internazionali dell'applicazione. Le DLL sono un modo pratico per fornire risorse specifiche delle impostazioni locali, che semplificano notevolmente la creazione di versioni internazionali di un'applicazione. Anziché spedire molte versioni localizzate dell'applicazione, è possibile inserire le stringhe e le immagini per ogni linguaggio in una DLL di risorse separata. L'applicazione può quindi caricare le risorse appropriate per le impostazioni locali in fase di esecuzione.

Un potenziale svantaggio dell'uso delle DLL è che l'applicazione non è autonoma. Dipende dall'esistenza di un modulo DLL separato: uno che è necessario distribuire o verificare se stessi come parte dell'installazione.

Altre informazioni su come creare e usare DLL

Gli articoli seguenti forniscono informazioni dettagliate su come creare DLL C/C++ in Visual Studio.

Procedura dettagliata: Creare e usare la propria libreria a collegamento dinamico (C++)
Viene illustrato come creare e utilizzare una DLL in Visual Studio.

Tipi di DLL
Vengono fornite informazioni sui diversi tipi di DLL che è possibile compilare.

Domande frequenti sulla DLL
Vengono fornite risposte alle domande frequenti relative alle DLL.

Collegare un eseguibile a una DLL
Viene descritto il collegamento esplicito e implicito a una DLL.

Inizializzare una DLL
Illustra il codice di inizializzazione dll che deve essere eseguito quando la DLL viene caricata.

DLL e comportamento delle librerie di runtime Visual C++
Descrive la sequenza di avvio della DLL della libreria di runtime.

LoadLibrary e AfxLoadLibrary
Illustra l'uso LoadLibrary di e AfxLoadLibrary per collegare in modo esplicito a una DLL in fase di esecuzione.

GetProcAddress
Viene illustrato l'uso GetProcAddress di per ottenere l'indirizzo di una funzione esportata nella DLL.

FreeLibrary e AfxFreeLibrary
Viene illustrato come usare FreeLibrary e AfxFreeLibrary quando il modulo DLL non è più necessario.

Ordine di ricerca libreria a collegamento dinamico
Descrive il percorso di ricerca usato dal sistema operativo Windows per individuare una DLL nel sistema.

Stati del modulo di una NORMALE DLL MFC collegata dinamicamente a MFC
Descrive gli stati del modulo di una NORMALE DLL MFC collegata dinamicamente a MFC.

MFC (DLL di estensione)
Illustra le DLL che in genere implementano classi riutilizzabili derivate dalle classi MFC esistenti.

Creazione di una DLL solo risorsa
Viene illustrata una DLL di sole risorse, ovvero che contiene unicamente delle risorse, come icone, bitmap, stringhe e finestre di dialogo.

Risorse localizzate nelle applicazioni MFC: DLL satellite
Viene descritto un supporto avanzato per le DLL satellite, una funzionalità che aiuta a creare applicazioni localizzate in più lingue.

Importazione ed esportazione
Viene descritto come importare simboli pubblici in un'applicazione o come esportare funzioni da una DLL.

Tecnologia attiva e DLL
Permette l'implementazione di server oggetti in una DLL.

Automazione in una DLL
Viene illustrata l'opzione di automazione nella Creazione guidata DLL MFC.

Convenzioni di denominazione per DLL MFC
Viene illustrato come le DLL e le librerie incluse in MFC seguono una convenzione di denominazione strutturata.

Chiamata di funzioni DLL da applicazioni Visual Basic
Viene descritto come chiamare funzioni nelle DLL dalle applicazioni Visual Basic.

Uso di MFC come parte di una DLL
Descrive le normali DLL MFC, che consentono di usare la libreria MFC come parte di una libreria a collegamento dinamico di Windows.

Versione DLL di MFC
Viene descritto come usare le librerie di collegamento dinamico condivise MFCxx.dll e MFCxxD.dll (dove x è il numero di versione MFC) con applicazioni MFC e DLL di estensione MFC.