Creare una DLL in Visual C++ 6.0
Vedremo in questo articolo come creare una Dynamic Link Link Library, comunemente chiamata DLL con Visual C++ 6.0. Questo passo è necessario per poi dimostrare l'utilizzo di librerie C/C++ in .NET tramite il package System.Runtime.InteropServices
Premessa
La rivoluzione provocata da .NET è realmente di grandi dimensioni. Non dobbiamo però dimenticare che la maggior parte del codice delle applicazioni e dei servizi sparsi per i server di tutto il mondo è ancora scritta con linguaggi, concedetemi il termine, "di vecchia generazione" come C/C++ per esempio.
Naturalmente non è possibile eliminare tutte le applicazioni esistenti per poi riscriverle da capo con .NET anche se tutto sommato la velocità e la produttività con l'ambiente nuovo è sicuramente migliorata.
.NET ci viene in aiuto con un package (System.Runtime.InteropServices) che ci permette di integrare nelle applicazioni nuove, librerie e oggetti creati precedentemente in modo da procedere con una migrazione quasi indolore.
Questo articolo è la prima di due parti e serve come introduzione per capire come si può costruire una DLL.
Che cos'è una DLL?
Sappiamo tutti, che quando sviluppiamo un'applicazione, un software, quando le linee di codice aumentano sensibilmente è necessario o per lo meno consigliabile spostare parte del codice esternamente, per milgiorare la leggibilità e per creare del software "a moduli" che è più facile da gestire, da aggiornare e da modificare.
Non a caso software grossi come un sistema operativo, per esempio Windows, sono dotati di una ricca serie di librerie (DLL), che scatenano le ire degli utenti per la quantità di spazio occupata :), che servono per estendere le funzionalità del sistema stesso.
Dalle librerie DirectX per i Videogames, alle librerie per il rendering delle pagine HTML di Internet Explorer, alle librerie per la gestione delle periferiche di input (mouse, tastiere, joystick, ecc.)
Insomma, una DLL è come se fosse un programma, sottolineo non eseguibile, che contiene al suo interno funzioni richiamabili da programmi esterni, sono in pratica delle estensioni dei nostri programmi.
Visual C++ 6.0 e le DLL
Da tempo ormai Visual C++ 6.0 è lo strumento per creare applicazioni di alta qualità e con performance elevate. L'ambiente ci permette di creare due tipi di DLL:
- Dynamic Link Libraries (sono proprio le DLL di cui parliamo e vengono linkate a run-time)
- Static Libraries (sono i file .obj e .lib, servono durante il linking dell'applicazione)
Noi in questo caso abbiamo bisogno di creare le prime.
Si parte... aprite Visual C++ 6.0!
Come indicato nell'oggetto è necessario aprire il nostro ambiente e dal menù File selezionare Nuovo.
Comparirà una maschera in cui si potrà scegliere il tipo di progetto.
Selezionate "Win32 Dynamic Link Library" e date un nome al progetto. Usiamo come nome SumDLL.
Proseguite con lo wizard e selezionate l'opzione "A simple DLL Project".
Premete Finish e poi Ok.
Se aprite il file appena creato SumDLL.cpp vedrete una funzione chiamata DllMain. Questa funzione è l'"entry point" della DLL. L'entry point è la funzione che viene eseguita ogni qual volta viene richiamato del codice all'interno della libreria.
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
return TRUE;
}
A questo punto possiamo implementare la nostra funzione.
Per non fare troppa confusione ho scelto di utilizzare una semplice funzione che calcola la somma di due numeri. Quindi aggiungiamo al codice già presente quello del listato 2:
extern "C" __declspec(dllexport) int Somma(int a, int b)
{
return a+b;
}
Bene, il tutto dovrebbe apparire abbastanza chiaro. E' una funzione che restituisce un tipo int, prende due parametri in ingresso (a, b) sempre di tipo intero, e ritorna la somma dei due addendi.
C'è da fare chiarezza sul significato di export "C" __declspec(dllexport).
Queste keyword sono necessarie per indicare al compilatore che la funzione Somma dev'essere esportata e quindi dev'essere resa visibile all'esterno e il nome della funzione dev'essere creato utilizzando il linking di tipo "C" (export "C"). (Si poteva usare anche il linking normale di tipo C++ ma il compilatore avrebbe creato per la funzione, a causa della name decoration diversa, un nome strano e avremmo dovuto seguire altri step per modificarlo in base alle nostre esigenze).
Se noi andiamo a compilare e a costruire la DLL tramite i comandi del menù (Build->Compile e Build->Build DLL) e la analizziamo con l'utilità DUMPBIN.EXE fornita con Visual C++ 6.0, noteremo che la nostra funziona è stata esportata correttamente (la vedete colorata di rosso in grassetto), ecco l'output:
Dump of file sumdll.dll
File Type: DLL
Section contains the following exports for SumDLL.dll
0 characteristics
3E462593 time date stamp Sun Feb 09 10:55:31 2003
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001010 Somma
Summary
1000 .data
1000 .rdata
1000 .reloc
3000 .text
Conclusione
Come avete visto i passaggi non sono molti, anche se l'argomento è abbastanza complesso, perchè i concetti da sapere sono parecchi e molto importanti, in più per la loro natura, linguaggi come C e C++ sono abbastanza ostici anche se molto potenti.
Abbiamo ora a disposizione la nostra DLL, che possiamo utilizzare richiamando la funzione al suo interno. Vedremo nella seconda parte, quindi nell'articolo collegato a questo, come utilizzare ciò che abbiamo creato, all'interno di un'applicazione WinForms sviluppata con .NET e testare una reale "migrazione del software".
N.B. Teoricamente la DLL è richiamabile anche da Visual Basic 6.0, ma a causa della modalità di compilazione usata non sarà possibile. Prego chiunque fosse interessato di contattarmi o di postare un messaggio sul Forum.
Voto medio articolo: 3.5 Numero Voti: 23