Home Page Home Page Articoli Creare una DLL in Visual C++ 6.0

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
Autore: David De Giacomi Livello:
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

File allegati


72_sumdll.zip (17 Kbyte)
David De Giacomi

David De Giacomi

Unico e irripetibile Profilo completo

Articoli collegati

Importare dati di Excel con .NET tramite ODBC o OLEDB e Drag & Drop
Spesso in ambito aziendale è necessario adattare le proprie applicazioni e consentire che possano leggere e operare su file e dati provenienti dai tools della suite di Office fra cui uno dei più usati è Excel. Vediamo quindi come importare dati da file XLS tramite ODBC/OLEDB e Drag & Drop.
Autore: Marco Farina | Difficoltà:
Gestire le Access Control List (ACL) NTFS di file e directory con .NET
Scopriamo come nel .NET Framework 2.0 sia diventato facile recuperare e modificare la lista controllo accessi dei file e directory e in generale come gestire le ACL.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Costruire un client FTP usando il .NET Framework 2.0
In questo articolo tratteremo una delle novità più attese del .NET Framework 2.0, le classi per l'utilizzo del protocollo FTP. Realizzeremo un mini client FTP con alcune fra le funzionalità più comuni.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 28
Alla scoperta di WMI, questo sconosciuto
WMI o Windows Management Instrumentation è un componente fondamentale del sistema operativo Windows. La sua utilità è permettere l'accesso a informazioni fondamentali del sistema, come informazioni sull'hardware, software, servizi, ecc. Vediamo come sfruttarlo con .NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2
Gestire e sfruttare i campi BLOB usando .NET
I database server sono software con una potenza elevata e offrono una vasta gamma di features che spesso non vengono utilizzate. Una di queste sono i campi BLOB (campi per contenere dati in formato binario). Vediamo in questo articolo come utilizzarli con .NET.
Autore: David De Giacomi | Difficoltà: | Commenti: 13
Catturare immagini da una Webcam con .NET
In questo articolo mostreremo come è possibile costruire una applicazione per catturare immagini da una Webcam, utilizzando componenti già presenti in Windows, in questo caso l' Avicap32.dll
Autore: Giovanni Ferron | Difficoltà: | Commenti: 22 | Voto:
Usare il protocollo POP3 per creare un Client di posta
Volete costruirvi un client di posta? Volete costruire una Web Mail ? Ecco un articolo che vi introduce al protocollo POP3 e vi insegna come costruire un mini client di posta elettronica.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2 | Voto:
La stampa di una Win Form
Vedremo in questo articolo i passi necessari per creare una stampa sia di testo che di grafica di una WinForm attraverso .NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 9 | Voto:
Creare un Setup di un progetto con Visual Studio .NET
Ecco delle semplici ma dettagliate istruzioni passo-passo per costruire un pacchetto di Setup (Setup Package) per le nostre Applicazioni WinForms.
Autore: Marco Caruso | Difficoltà: | Commenti: 18
Creare un?icona nella Taskbar di Windows con .NET
Scoprirete come potenziare la vostra applicazione aggiungendo un'icona nella barra di Windows nella famosa Tray Area a fianco dell'orologio del sistema. Disponibile sia codice VB.NET che C#.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 1 | Voto:
Costruire un Servizio di Windows usando .NET
Un avanzato tutorial che vi spiegherà passo passo e in modo dettagliato le istruzioni per costruire un Servizio Windows, utilizzando ciò che il .NET Framework ci mette a disposizione. Disponibile sia codice C# che VB.NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 13 | Voto:
Windows XP Visual Styles con .NET e Win Forms
Come usare lo stile XP nelle vostre applicazioni .NET ? Questo articolo vi spiega come applicare a Buttons, Textbox, ListViews (ai controlli di Windows in genere) lo stile/tema grafico della GUI introdotto dal sistema operativo Windows XP.
Autore: David De Giacomi | Difficoltà: | Commenti: 7
Come sfruttare le funzioni di una DLL unmanaged esterna creata in C/C++
Come usare la classe DllImportAttribute messa a disposizione dal namespace System.Runtime.InteropServices per sfruttare le funzioni di una DLL unmanaged Win32 old-style scritta con Visual C++ 6.0
Autore: David De Giacomi | Difficoltà: | Commenti: 4 | Voto:
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5