Forum: PC-Programmierung Mit C++ feststellen welche Betriebsystem


von Firefly (Gast)


Lesenswert?

Hi!

Gibt es unter Borland Builder C++ die Möglichkeit festzustellen, welche
Betriebssystem gerade läuft?
Es muss bestimmt eine API Funktion geben die dies ermöglicht oder?

von Rufus T. Firefly (Gast)


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) ) );

von Joe (Gast)


Lesenswert?

Hallo Rufus!

Hei Danke für die Info!
Leider funktioniert dies bei mir nicht.
Kannst du mir ein Beispiel geben?

Gruß

von Thomas (Gast)


Lesenswert?

am besten doch einfach im msdn nachlesen :)
(rufus' beispiel scheint übrigens auch von dort zu stammen)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getversionex.asp

du solltest auch dem link auf der seite zur struktur OSVERSIONINFO
folgen.

von Rufus T. Firefly (Gast)


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.

von Firefly (Gast)


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.

von Thomas (Gast)


Lesenswert?

"Requires Windows XP, Windows 2000 Professional, Windows NT Workstation
3.5 and later, Windows Me, Windows 98, or Windows 95."

?

von Thomas (Gast)


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.

von Firefly (Gast)


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?

von Rufus T. Firefly (Gast)


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?

von Firefly (Gast)


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?

von Rufus T. Firefly (Gast)


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.

von Firefly (Gast)


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?

von Rufus T. Firefly (Gast)


Lesenswert?

TRUE. Also ein Wert != 0.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.