Newsgroup: it.comp.programmare.win32
Titolo: Stranezza da un esempio del Petzold

Ciao a tutti !
Sono un newbie del gruppo e della programmazione win32.
Sto studiando sul Petzold, Programming Windows 5th ed. e uno degli
esempi del libro mi da un errore.
Mi riferisco al programma SysMets1 del capitolo 4 dove fa vedere
l'utilizzo della funzione GetSystemMetrics.
Quando vado a compilare l'header sysmets.h dove sono richiamate tutte
le costanti del tipo SM_, il compilatore (Visual C++ 6) mi dice
"undeclared identifier" per le costanti:
SM_MOUSEWHEELPRESENT
SM_XVIRTUALSCREEN
SM_YVIRTUALSCREEN
SM_CXVIRTUALSCREEN
SM_CYVIRTUALSCREEN
SM_CMONITORS
SM_SAMEDISPLAYFORMAT
Se commento le linee incriminate il resto del programma funziona.
Il mio SO e' Win2000 e sulla MSDN per quelle costanti ho visto che
alcune non sono definite per WinNT o 95 ma dovrebbero esserlo per
Win2000... 
Tramite Google Groups ho trovato chi ha avuto lo stesso problema con
l'esempio del Petzold e dicevano che negli header c'era questa
definizione:
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
#define SM_MOUSEWHEELPRESENT    75
#endif
Quindi dicevano che bastava inserire
#define WINVER 0x0500
per far funzionare il programma. E in effetti funziona...
Pero' il compilatore come previsto mi ha sparato una pappardella di
warning sulle versioni di windows e di stare attento se voglio vendere
il mio programma perche' potrebbe avere problemi di compatibilita'
(ovvio, definisco a mano la versione di win...)
Ora il bello e' che alla seconda compilazione del programma il warning
e' sparito e se provo a cancellare la definizione di WINVER non ci
sono piu' errori e il programma funziona bene !
Chi mi sa dire cosa e' successo ?
-- 
Ciao e grazie!
Lorenzo

 Chi mi sa dire cosa e' successo ?
Header Precompilati. Hai messo il WINVER nel programma principale invece che
nel stdfx.h. Sei stato fortunato e tutto č stato compilato correttamente. Di
solito le definizioni le metti nel stdfx.h. Nel tuo caso il VC non si č
accorto che gli header precompilati non erano piů validi, avendo tu
modificato una costante, e non li ha ricompilati. Risultato? Il WINVER č
definito negli header ma non fuori. Un mezzo bordello insomma :-)
--- bye

Dimenticavo... Quindi: il WINVER lo devi mettere nello stdafx.h subito prima
degli #include, e se vuoi ricompilare tutto usa il Build All mi sembra,
oppure il Rebuild.
--- bye

definito negli header ma non fuori. Un mezzo bordello insomma :-)
wow... bella prova...
Ho fatto un casino irrimediabile ? come rimedio ? ^___^;;;
-- 
Ciao e Grazie per l'aiuto !
Lorenzo

oppure il Rebuild.
Ok, con Rebuild All mi ritorna l'errore perche' avevo tolto la
definizione...
A questo punto mi sfugge il perche' dell'errore... Win2000 non
dovrebbe avere gia' il WINVER al valore giusto ?
-- 
Ciao e Grazie !
Lorenzo

 dovrebbe avere gia' il WINVER al valore giusto ?
Il WINVER serve per definire il "target" dell'applicazione. Tu non programmi
solo per te stesso, ma per tutto il mondo :-)
Serve per far sě che se tu usi delle funzioni solo del Win2000 tu sia sicuro
di quello che stai facendo.
Di base il Winver parte con solo le cose del Win 95 mi sembra.
--- bye

 link)
Servono perchč compilare ogni volta decine di migliaia di righe di header
non ti passa piů. Allora gli header vengono "precompilati" una volta per
tutte. Tu nello stdafx ci dovresti mettere gli header delle librerie
"esterne" al tuo programma. In questa maniera il VC le compila una volta per
tutte. Chiaro che se tu cambi una qualche costante di queste librerie il VC
deve rifare l'header precompilato (ma se tu le costanti le metti nello
stdafx.h allora lui si accorge che č cambiato e lo ricompila da solo)
--- bye

stdafx.h allora lui si accorge che č cambiato e lo ricompila da solo)
Ok, tutto chiaro, grazie anche per l'altra risposta. ;)
-- 
Ciao !
Lorenzo