venerdì 12 giugno 2009

Introduzione alle API Win32, Parte 1/6 - DevSpy.com

 

Introduzione alle API Win32, Parte 1/6

di Mastersgn, del 18 ottobre 2006 C/C++

Proponiamo ai lettori questo primo capitolo di introduzione alle WinApi a 32 bit, in modo da affrontare con più certezza il restante tutorial. Verranno chiariti concetti di base sui tipi di dati e faremo qualche considerazione sull'ambiente di sviluppo scelto. Per utenti che possiedono già esperianza, questa parte può essere saltata. Tuttavia, presentiamo alcune considerazioni sulla stesura del codice e dello stesso tutorial che si riveleranno utili nella lettura degli articoli successivi.

Introduzione

In questa guida impareremo ad usare le API (Application Programming Interfaces) di Microsoft Windows in modalità 32 bit. Il linguaggio di sviluppo scelto è il C, ma se utilizzate il C++ non incontrerete particolari difficoltà nel comprendere e seguire gli articoli (infatti, le chiamate alle funzioni sono le stesse). Piuttosto, è probabile che C++ vi offra qualche possibilità in più; per cui non dovrebbe esservi difficile modificare quelle piccole parti di codice che dovessero risultare non adeguate.

Requisiti software

Come IDE (Integrated Development Environment) useremo il Dev-C++ della Bloodshed, scaricabile gratuitamente dal sito del produttore (www.bloodshed.net/devcpp.html).

Se utilizzate un altro IDE/compilatore, anche in questo caso non dovrebbe cambiare molto. Sarà sufficiente indicare al compilatore dell'IDE che si sta compilando un'applicazione Windows GUI e non una CUI in generale. Dopodiché, siccome ogni ambiente ha le proprie particolarità, dovrete gestirle personalmente.

Siccome un programma per Windows32 normalmente ricorre alle "librerie di connessione" al sistema (specificamente almeno le tre "canoniche": kernel32.lib, gdi32.lib e user32.lib) potrebbe essere necessario installare il Platform SDK, scaricabile dal sito Microsoft.

Come usare questa guida

Questo tutorial sarà suddiviso in capitoli. Se avete la tentazione di saltare porzioni del tutorial, vi chiedo di avere pazienza e leggere comunque ogni articolo per intero. Questo perché in quelle parti che potreste saltare, potrebbero esserci proprio le risposte alle domande che vi porrete in seguito.

Se doveste trovare errori logici nel corso del tutorial o avete domande in merito, potete contattarmi via e-mail.

Cosa dovete aspettarvi

Win32 utilizza molte macro e typedef definite all'interno del file windows.h, che verrà sempre incluso. Quindi, soprattutto se siete agli inizi, potreste restare disorientati di fronte alla quantitità di nuovi tipi e costanti; ma col passare del tempo vi risulteranno sempre più familiari.

Ovviamente, programmando in C definiremo le variabili all'inizio di ogni blocco e non solo dove servono come si potrebbe fare in C++ (coloro che programmano in C++ saranno comunque liberi di farlo). Per la stessa ragione racchiuderemo i commenti tra /* e */ (mentre in C++ potrete usare i soliti commenti in linea, preceduti da //).

Per migliorare la leggibilità della guida, potrebbe accadere che faccia distinzione tra procedure e funzioni, anche se nel linguaggio C - come sapete - sono considerate tutte funzioni.

Ultima nota: molte delle funzioni che troverete in questo tutorial, sono spiegate più approfonditamente nella documentazione in linea di MSDN dedicata a questo argomento. Su MSDN, trovate spiegazioni accurate di tutte le funzioni, i tipi, le strutture e gli altri oggetti di cui faremo menzione.

Un breve sguardo sui tipi utilizzati

Per prima cosa, sarebbe oppurtuno spiegare a cosa corrispondono e come ragionare con diversi tipi di dati che useremo nei nostri esempi. Diamo quindi un'occhiata ai primi:

  • UINT     ->  unsigned int
  • LPSTR    ->  char*
  • PVOID    ->  void*
  • ULONG    ->  unsigned long
  • CHAR     ->  char
  • CONST    ->  const
  • INT      ->  int
  • LONG     ->  long
  • VOID     ->  void
  • WORD     ->  unsigned short
  • HANDLE   ->  PVOID
  • HMENU    ->  HANDLE
  • HRESULT  ->  LONG

Questi tipi sono i più basilari ed intuitivi. Vi invito ad analizzare sempre i nomi degli oggetti con cui avrete a che fare studiando le API, perchè impararli semplicemente a memoria come dato di fatto non sarebbe molto profittevole.

Come vedete, molti nomi sono identici ai tipi solitamente usati ma scritti in maiuscolo. Se preceduti dalla lettera U stanno a significare un tipo senza segno (unsigned). Analizzando LPSTR osserviamo subito che è un puntatore ad una stringa e che LP sta per long pointer. STR, invece, facile immaginarlo... Nello stesso modo se consideriamo PVOID, P sta per pointer e VOID per "vuoto". Se mettiamo una C per esempio all'interno di LPSTR, otteniamo LPCSTR, che sta ad indicare una costante; nel senso che è un puntatore ad una stringa costante che non verrà quindi modificata. Osservando HANDLE notiamo che corrisponde ad un PVOID; ci accorgeremo che molti di questi tipi saranno usati spesso. A sua volta HMENU corrisponde ad HANDLE, e così via per molti altri tipi.

Non è ancora il momento di analizzarli tutti. Penso che abbiate capito il modo in cui vengono gestiti in generale e col tempo ci farete l'abitudine. Tengo a precisare che molti tipi che non ho indicato qui, li spiegherò nel corso del tutorial (ma ci dovrete arrivare da soli ragionandoci). Se avete bisogno di maggiori delucidazioni sui tipi di dati, consultate il capitolo Windows Data Types nella referenza MSDN già citata.

Ultima cosa: può darsi che nel vostro codice siate abituati ad usare il solo char* al posto di un PCHAR. Per svariati motivi - sui quali non ci dilunghiamo in questa sede - ciò non è consigliabile. Perciò, nel codice degli esempi useremo sempre PCHAR.

Ultime considerazioni

Dovreste entrare nell'ottica di separare mentalmente le API dalla solita programmazione CUI, comprendendo bene che sono due cose diverse. Lasciando stare l'esattezza della mia affermazione, questo è utile per non confondersi (ed uno dei motivi a cui accennavo prima per i tipi).

Seconda cosa: non dovrete includere come libreria di I/O la stdio.h ma la windows.h (col classico #include <windows.h>). Quindi per ciascuna funzione di lettura/scrittura di cui dispone la prima libreria (tipo printf(), scanf()) ne saranno presenti una o più nella seconda. Quando definiremo la macro WIN32_LEAN_AND_MEAN (#define WIN32_LEAN_AND_MEAN) indicheremo di utilizzare solo le funzioni più comuni della libreria windows.h, accellerando la compilazione del nostro codice.

Bene, siamo finalmente pronti per iniziare con il codice vero e proprio, nel prossimo articolo.

Introduzione alle API Win32, Parte 1/6 - DevSpy.com

Nessun commento:

Posta un commento