Mit C++ feststellen welche Betriebsystem

Gast #199464
Lesenswert?

Die Win32-API-Funktion GetVersionEx machts:


osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO)
GetVersionEx (&osvi);
bIsWindows98orLater =
   (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
   ( (osvi.dwMajorVersion > 4) ||
   ( (osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0) ) );
Gast #199467
Lesenswert?

"Leider funktioniert dies bei mir nicht."

Ich liebe so präzise Aussagen. Was soll ich mir daraus
zurechtreimen?

Dank an Thomas für die Präzisierung; ich hatte allerdings mit der
Offline-Version der MSDN gearbeitet und konnte daher keinen Link posten
(was hilft euch ein Link auf einen lokalen Netzwerkserver?).

Die MSDN-Dokumentation ist (mittlerweile*) ziemlich gut, da auch
Rahmenbedingungen (welche Headerdatei muss eingebunden werden, welche
Importlibrary muss verwendet werden etc.) beschrieben werden.


*) war ein langer Leidensweg. Ich arbeite seit über zwölf Jahren damit.
Gast #199468
Lesenswert?

Ok ich habe mal auf der MSN Seite die Info daz gelesen.
So wie es aussieht funktioniert diese Funktion nicht unter Windows95,
Windows98 und WIndowsME.

Ich brauche aber eine Funktion womit ich feststellen kann, welches
Betriebssystem gerade aktiv ist.
Gast #199470
Lesenswert?

wenns nicht klappt, gibts noch ne andere möglichkeit:
startbild suchen und texterkennung drüber laufen lassen.

bei nt/2k/xp ist das startbild (wenn ich mich recht erinnere) eine
ressource in der datei ntoskrnl.exe, welche sich im system32
verzeichnis befinden sollte, bei den anderen versionen war es ne datei
namens logo.sys im windows verzeichnis.
Gast #199471
Lesenswert?

Danke für die Unterstützung!

Leider bringt mir das jetzt nicht weiter.
Gibt es keine gemeinsame API Funktion unter WinNT, Win2000, Win98,
WinME womit ich feststellen kann, womit das System gerade läuft?
Gast #199472
Lesenswert?

Der Dokumentation zufolge funktioniert die von mir genannte Funktion
auch unter den 9x-Varianten von Windows.

Was exakt ist denn das Fehlerverhalten? Du schreibst nur "funktioniert
nicht" - was soll diese extrem präzise Formulierung bedeuten? Kann Dein
Compiler den Code nicht übersetzen, gibt's 'ne Exception, gibt die
Funktion 0 zurück, gibt's 'nen Bluescreen oder was?
Gast #199473
Lesenswert?

Den Code habe ich bei mir in Borland Builder C++ implementiert.
Sorry leider weiss ich nicht mehr was der Compiler als Fehlermeldung
angegeben hat.

Zudem verstehe ich den Code nicht!

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO)
GetVersionEx (&osvi);
bIsWindows98orLater =
   (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
   ( (osvi.dwMajorVersion > 4) ||
   ( (osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0) ) );

Welcher Wert wird dann zurückgegeben?
Welcher Wert entspricht dann dem aktiven Betriebssystem?
Gast #199474
Lesenswert?

Etwas ausführlicher als das MS'sche Code-Fragment:

  OSVERSIONINFO osvi;

  memset(&osvi, 0, sizeof (OSVERSIONINFO));
  osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO)

  GetVersionEx(&osvi);


Das ist bereits die ganze Versionsabfrage.

  BOOL bIsWindows98orLater =
   (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
   ( (osvi.dwMajorVersion > 4) ||
   ( (osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0) ) );

Das ist eine Auswertung der von GetVersionEx gelieferten Struktur -
bIsWindows98orLater wird dem Namen entsprechend gesetzt.

Wenn Du Dir die MSDN-Dokumentation, zu der Thomas erfreulicherweise
einen Link gepostet hat, mal durchläsest, könntest Du Dir die Funktion
der einzelnen Member der Struktur OSVERSIONINFO ansehen.
Gast #199475
Lesenswert?

Ok jetzt habe ich den Code einigermaßen kappiert.
BOOL bIsWindows98orLater --> in desem stehet dann drin 1 oder 0.
Oder?

Welcher Wert erscheint wenn ich WinME oder Win2000 oder WinXP oder
WinNT benutze?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren