[ Duke Nukem @ 26.03.2007. 12:34 ] @
Koritim BCB6 i XP
Primetio sam sledecu anomaliju

API poziv GetVersionEx( OSVERSIONINFO )
OSVERSIONINFO - dwPlatformId daje vredost VER_PLATFORM_WIN32s
sto odgovara Win32s on Windows 3.1 , a ne na primer Win32 on Windows 95.
ili Win32 on Windows NT sto je malo logicnije.
Da li je to normalno ?
if! Da li greska u MS API funkciji ?
if !
Da li su sve MS API funkcije 100% pouzdane (bug free) ?

;-s Nadam se da sam nasao dobru temu za diskusiju.
[ kiklop74 @ 26.03.2007. 17:33 ] @
http://msdn2.microsoft.com/en-us/library/ms724429.aspx
[ X Files @ 26.03.2007. 17:41 ] @
Pozdrav,

Pokaži kod koji dovodi do tog problema. To mi je uvek radilo bez problema. Verovatno si
nešto prevideo u samom kodu...

Ovde je originalni M$ primer:
http://msdn2.microsoft.com/en-us/library/ms724429.aspx

Maločas sam ga isprobao u BCB6 (malo sam ga modifikovao da proradi), i sve je OK.



[ Duke Nukem @ 26.03.2007. 22:45 ] @
evo resenja:
OSVERSIONINFO osv;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // ova linija je bila izostavljena
GetVersionEx(&osvi);
......

opet rupa na saksiji
[ kiklop74 @ 28.03.2007. 02:17 ] @
Citat:
Duke Nukem: evo resenja:
OSVERSIONINFO osv;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // ova linija je bila izostavljena
GetVersionEx(&osvi);
......

opet rupa na saksiji


Prosto je neverovatno da vecina ljudi automatski radi copy&paste primera iz MSDN-a. Navedeni kod bi znacajno mogao da se skrati ovako (vazi samo za c++):
Code:

OSVERSIONINFO osv = {sizeof(OSVERSIONINFO)};  
GetVersionEx(&osv);

[ vlaiv @ 30.03.2007. 12:14 ] @
Citat:
kiklop74: Prosto je neverovatno da vecina ljudi automatski radi copy&paste primera iz MSDN-a. Navedeni kod bi znacajno mogao da se skrati ovako (vazi samo za c++):
Code:

OSVERSIONINFO osv = {sizeof(OSVERSIONINFO)};  
GetVersionEx(&osv);


Da, ali pod uslovom

1. Da je polje koje windows funkciji govori size strukture uvek na prvom mestu i 32bit-a ... (koliko ljudi to zna i vodi racuna o tome)
2. da kompajler automatski dodeli nule svuda (koliko ljudi to zna i vodi racuna o tome, i da li je sa svakim kompajlerom to slucaj)
3. Sta ako neko dinamicki alocira memoriju za strukturu pa proba taj kod? (za funkcije koje u odredjenim slucajevima ne popunjavaju
default 0 polja sa 0 pa ostane recimo 13 :) - znas na sta mislim)
[ kiklop74 @ 31.03.2007. 18:03 ] @
Citat:
vlaiv: Da, ali pod uslovom

1. Da je polje koje windows funkciji govori size strukture uvek na prvom mestu i 32bit-a ... (koliko ljudi to zna i vodi racuna o tome)
2. da kompajler automatski dodeli nule svuda (koliko ljudi to zna i vodi racuna o tome, i da li je sa svakim kompajlerom to slucaj)
3. Sta ako neko dinamicki alocira memoriju za strukturu pa proba taj kod? (za funkcije koje u odredjenim slucajevima ne popunjavaju
default 0 polja sa 0 pa ostane recimo 13 :) - znas na sta mislim)


1. U ovom slučaju polje jeste prvo i jeste 32-bit.
2. Standard c++ kaže da u slučaju delimične inicijalizacije strukture alocirane na steku - ostala neinicijalizovana polja se GARANTOVANO popunjavaju nulama.
3. Ako neko dinamički alocira neku strukturu i pokuša da je inicijalizuje na takav način onda je nedovoljlno upućen u c++ i treba da se lati neke pristojne knjige. A ako ipak to i uradi svaki kompajler će prijaviti da je to nedozvoljena operacija.

Treba da shvatiš da je moj primer namenjen samo konkretnom slučaju OSVERSIONINFO strukture i to samo u slučaju da je alocirana na steku.

Generalizovano pravilo bi glasilo ovako za bilo koju strukturu:

Code:

<NEKASTRUKTURA> <promenjiva> = {}; //inicijalizuje celu strukturu nulama
<promenjiva>.<veličina_strukture> = sizeof(<NEKASTRUKTURA>);

[ vlaiv @ 31.03.2007. 18:33 ] @
@kiklop74

Slazem se sa tobom, no poenta je bila u sledecem:


Citat:
Prosto je neverovatno da vecina ljudi automatski radi copy&paste primera iz MSDN-a.


Citat:
... (koliko ljudi to zna i vodi racuna o tome)


:) Shvatas sta hocu da kazem ...
[ kiklop74 @ 01.04.2007. 11:47 ] @
Citat:
vlaiv: @kiklop74
:) Shvatas sta hocu da kazem ...


OK. Shvatam. Ipak nije lose napomenuti. Mozda nekad, negde i pomogne nekom.

:)