Inizializzazione ed Esecuzione di un Programma Windows

Per chi conosce la programmazione in ambiente Windows di certo non avrà bisogno di leggere questo articolo, ma per chi si sta avvicinando a questo argomento oppure utilizza questo sistema operativo, sarà utile sapere le fasi di inizializzazione ed esecuzione di una tipica applicazione.
Un programma Windows inizia con la funzione WinMain() che riceve quattro parametri:

  1. L’handle dell’istanza corrente che è un valore che il sistema assegna per distinguere tra le varie copie dello stesso programma eventualmente in esecuzione.
  2. L’handle dell’istanza precedente che per ricorsione diventerebbe l’handle alla prima istanza del programma che è stata lanciata ed è sempre NULL, il suo mantenimento è dovuto soltanto per ragioni di compatibilità con il software esistente.
  3. La riga di comando che è una stringa contenente dei parametri che l’utente può passare all’applicazione, ad esempio: C:\Program Files\OpenOffice.org 3\program\swriter.exe -o “MioDoc.doc” che apre un documento di testo con OpenOffice. Il programmatore ovviamente avrà libertà di decidere i comandi che l’applicazione riesce a gestire e che di solito si trovano nella documentazione dell’applicazione oppure ottenute dallo stesso programma che può dare una lista di comandi supportati.
  4. Un flag di visualizzazione che dice il modo in cui va creata la finestra del programma, cioé la posizione, le dimensioni oppure se visualizzarla iconizzata oppure ancora massimizzata.

La fase di inizializzazione di un programma Windows comincia con WinMain() e termina con l’ingresso nel message-loop. Indipendentemente dal linguaggio di programmazione utilizzato le appplicazioni Windows hanno un ciclo dei messaggi, ogni azione che si farà sul programma, prima o poi, originerà un messaggio con un destinatario ed un contenuto. Il messaggio viene inviato attraverso la funzione SendMessage() o PostMessage(), unica differenza tra le due è che con la prima occorre attendere la risposta da parte del destinatario ( comunicazione sincrona ), mentre con la seconda no ( comunicazione asincrona ). Ogni messaggio ha delle informazioni al suo interno: l’handle della finestra bersaglio ( che deve gestire il messaggio ), il tipo di messaggio ( ad esempio WM_COMMAND o WM_SETSEL ), un valore WPARAM ed uno LPARAM che fungono da parametri del messaggio, ad esempio: SendMessage(hMyEdit, WM_SETSEL, -1, 0) consente di selezionare tutto il testo contenuto all’interno di un controllo EditBox. Windows inserisce il messaggio, la window-procedure lo raccoglie e legge le istruzioni contenute all’interno, questo meccanismo di callback è alla base del funzionamento dell’intero sistema operativo.
Durante la fase di avvio un programma deve portare a termine due operazioni principali: la registrazione della classe della finestra principale del programma e la sua creazione. Durante quest’ultimo passaggio si devono creare la barra degli strumenti, la barra di stato, il menu e caricare i valori memorizzati, come la posizione o le dimensioni, nel registro di sistema, che è il contenitore delle informazioni delle finestre.
A meno di non prendere dei provvedimenti, ogni volta che un utente fa clic o doppio clic, a seconda delle sue impostazioni, sull’icona del programma, quest’ultimo reagisce caricandosi in memoria ed andare in esecuzione. Tutto questo significa che i dati gestiti dal programma dovranno esserlo anche da più applicazioni contemporaneamente, se così non fosse occorre prendere dei seri provvedimenti e consentire una sola istanza dell’applicazione ( single-instance ). Il modo per farlo è semplice, basta analizzare la RAM e vedere se esiste qualche applicazione con la stessa classe registrata, a qual punto si invia un PostQuitMessage().
Lo scopo di questo articolo non è quello di insegnare la programmazione delle finestre in Windows, ma avere dei contenuti utili agli utenti a cavallo tra chi utilizza il sistema operativo ed il programmatore agli inizi dei suoi studi. Spero che i contenuti di questo articolo siano serviti a molti per capire da vicino come funziona un sistema operativo come Windows.

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.