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":
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.