Introduzione alle API Win32

Capitolo 0: preliminari

Questa introduzione alla programmazione di Win32 a basso livello ("Win32 API", o come anche si dice "Win SDK") ha come unico prerequisito la padronanza del linguaggio C (e dei relativi strumenti: editor, compilatore, linker, debugger, ...).

Le API ("Application Programming Interfaces", interfacce per programmi applicativi) di Windows possono essere accedute, con vari metodi e stratagemmi, anche da tanti altri linguaggi di programmazione, ma questo argomento meriterebbe una trattazione separata per ciascuno di questi linguaggi (Visual Basic, Perl, Python...); qui, invece, parleremo in C -- il linguaggio, tutto sommato, più vicino allo "spirito" delle API stesse, e in cui risulta più naturale chiamarle.

Qualsiasi buon compilatore C (o C++) per Windows a 32 bit dovrebbe essere in grado di compilare e linkare i vari esempi che daremo; consigliamo, ad esempio, il "leggero" compilatore LCC-Win32, scritto da Jacob Navia basandosi sul compilatore portatile LCC di Dave Hanson e Chris Fraser; forse ancora migliori sono gli eccellenti port, fatti da Mumit Khan, del popolarissimo compilatore gcc 2.95 a varie "piattaforme" per Win32 (la più "leggera", Mingw32, che personalmente preferisco; e altre due, più "ricche").

Può essere necessario istallare il "Platform SDK" della Microsoft per Win32, scaricabile gratuitamente dal sito Microsoft, se il proprio compilatore non comprende già i vari file e strumenti necessari; l'SDK include sia gli header, sia le librerie, e anche vari strumenti, documentazione, programmi di esempio; dall'URL già indicata si può inoltre accedere ad ampia documentazione in linea (parte dell'importante sito MSDN della Microsoft).

Le moltissime dichiarazioni e definizioni necessarie per programmare le API possono quasi interamente essere ottenute dal file d'include <windows.h>, che a sua volta ne tira dentro tanti altri (esamineremo separatamente, in un'altra trattazione, le varie classi di API per le quali è necessario specificare altri file d'include). È possibile in certi casi essere più selettivi, ma normalmente è molto più semplice includere tutto <windows.h> e non preoccuparsi di questi dettagli (aiuta molto, in termini di tempo di compilazione, l'uso delle funzionalità di "precompilazione degli header" che siano eventualmente messe a disposizione dal proprio compilatore preferito).

Prima di includere <windows.h>, è meglio definire un paio di macro, che ne controllano l'esatto contenuto. La macro STRICT, fortemente consigliata, è quella che permette di usare con precisione i tipi, come faremo in tutta questa trattazione. La macro WIN32_LEAN_AND_MEAN esclude dall'inclusione automatica alcune feature raramente usate, e può accelerare la compilazione senza troppi problemi. Queste due macro le useremo sempre, salvo diverso avviso.

La macro WINVER definisce la versione di Windows che interessa; per accedere alle feature specifiche di Win98, ad esempio, WINVER dev'essere definita a 0x0500. Ma per ora non avremo bisogno di quest'ultima particolarità, e neppure di altre macro che controllano altri aspetti un po' esoterici di windows.h e soci (la più importante di queste è senza dubbio UNICODE, che permette di usare un insieme di caratteri a 2 byte; purtroppo, i programmi UNICODE non funzionano su Win95 e Win98, ma solo WinNT, Win2000, e WinCE [quest'ultima piattaforma, anzi, supporta solo la codifica Unicode]).

 

All'inizio dei nostri esempi (o nel file degli header pre-compilati, se il vostro compilatore li supporta) avremo dunque sempre il "preambolo":

#define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h>

Per poter essere linkato, un programma per Windows32 dovrà normalmente aggiungere al link (se già non lo fa in modo automatico il vostro compilatore) le "librerie di connessione" al sistema: specificamente, quasi sempre, almeno le tre "canoniche", kernel32.lib, gdi32.lib, e user32.lib. Anche queste fanno parte del "Platform SDK" suaccennato, se già non le trovate allegate al vostro compilatore.


Capitolo 1: disimparare
Elenco dei capitoli