Seite 1 von 2

Betriebssystem ermitteln

Verfasst: 2. März 2009 15:47
von petter82
Hallo, ich habe ein Problem...
ich möchte gern beim start meines programmes das Betriebssystem herausfinden, auf welchem ich meine applikation starte.
Gibt es eine Möglichkeit sich das Betriebssystem geben zu lassen und dazu auch noch die richtige version.
wie zum Beispiel:

OS=Windows, Version=XP

oder sowas in dieser Art?
ich würde gern für mein programm verschiedene styles laden, welche vom Betriebssystem abhängig sein sollen.

Verfasst: 2. März 2009 15:53
von chrootdev
Welches betriebssystem läuft, das kannst du per präprozessor abfragen, alle möglichen betriebssysteme findest du ziemlich am ende der seite!
http://pronix.linuxdelta.de/C/standard_ ... g_13.shtml

Verfasst: 2. März 2009 17:44
von Christian81
... oder einfach mal die Qt Doku anschauen: http://doc.trolltech.com/4.4/qsysinfo.html

Verfasst: 3. März 2009 07:54
von petter82
ich danke euch für eure vorschläge, aber diese Möglichkeit benutze ich schon. Ich wollte eigentlich wissen, ob es eine andere Lösung gibt. Ich möchte nicht unbedingt auf jedes Betriebssystem testen, welches es ist, sondern gleich, vielleicht über ne bestimmte Methode wissen auf welchem ich arbeite. Wahrscheinlich scheint es das nicht zu geben... ich versuche mein Glück erstmal so...trotzdem nochmal vielen dank...

Verfasst: 4. März 2009 11:44
von CLRS530
Doch das gibt es.

Code: Alles auswählen

#ifdef Q_OS_WIN32
#ifdef Q_OS_Unix
Da gibt es noch einige spezifischere und natürlich auch für Mac. Musst du mal gucken.
Ich wollte das schon vorher geschrieben haben, aber ich hatte nicht den Eindruck, dass es das ist was du suchst.

Verfasst: 4. März 2009 12:34
von Christian81
Nein - er möchte einen String haben soweit ich das verstanden habe. Da aber jeder eine andere Idee hat wie dieser String auszusehen hat und was da drin steht ist dies generisch nicht möglich.

Verfasst: 5. März 2009 07:51
von petter82
ich frage nun alle gängigen betriebssysteme per #ifdef ab und baue mir selbst einen string mit dem betriebssystem und der version zusammen. scheint keine einfachere lösung zu geben, aber es funktioniert einwandfrei...danke euch trotzdem...

Verfasst: 5. März 2009 11:33
von franzf
Wobei auch diese Lösung nicht wirklich funktioniert.
Du kannst ein Programm unter Win XP kompilieren, danach aber auf nem Win Vista ausführen. Dann zeigt dein Programm trotzdem XP an, da die Präprozessordirektiven vor der Kompilierung ausgewertet werden, und während der Laufzeit dann nicht mehr geändert werden können.

Wirst wohl nicht drum rum kommen, da einen Zwischenweg zu gehen.

Verfasst: 5. März 2009 12:37
von AuE
Für Windows gäbe es das hier.... is aber net wirklich zufriedenstellend....

Code: Alles auswählen

Get the OS version on your PC

#include <windows.h>
#include <iostream>
#include <dos.h>
#include <string.h> 
int main(void)

{
OSVERSIONINFO osver;
osver.dwOSVersionInfoSize = sizeof(osver);
if (GetVersionEx(&osver))

{
if (osver.dwPlatformId == VER_PLATFORM_WIN32s)
cout <<"Win32 ";
else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)

{
if (osver.dwMinorVersion == 0 && (strchr(osver.szCSDVersion,'B') == NULL)
&& (strchr(osver.szCSDVersion,'C') == NULL))
cout <<"Windows 95 ";
else if (osver.dwMinorVersion == 0 && (strchr(osver.szCSDVersion,'B') != NULL))
cout <<"Windows 95 OSR 2 ";
else if (osver.dwMinorVersion == 0 && (strchr(osver.szCSDVersion,'C') != NULL))
cout <<"Windows 95 OSR 2.5 ";
else if (osver.dwMinorVersion == 10 && (strchr(osver.szCSDVersion,'A') == NULL))
cout <<"Windows 98 ";
else if (osver.dwMinorVersion == 10 && (strchr(osver.szCSDVersion,'A') != NULL))
cout <<"Windows 98 Second Edition ";
else if (osver.dwMinorVersion == 90)
cout <<"Windows Millenium Edition ";
else
cout<<"Unknown Windows ";
}
else if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
cout <<"Windows NT ";
cout <<osver.dwMajorVersion<<"."<<osver.dwMinorVersion<<"."
<<(osver.dwBuildNumber & 0xffff)<<osver.szCSDVersion<<endl;
}
else


{
cout <<"Cannot gain version information."<<endl;
}
system("pause");
return 0;
}
geklaut vonhttp://www.cplusplus.happycodings.com/c ... ode19.html

Verfasst: 5. März 2009 12:40
von Christian81
@Aue: Warum dann nicht gleich QSysInfo ???

Verfasst: 5. März 2009 12:43
von androphinx
naja, anders als über die windows-api wirst du es nicht herausfinden, aber wenn du das Programm dann auch unter Linux zum laufen bringen willst, baust du einfach die oben angesprochenen Präprozessordirektiven ein. Und dann funktioniert das schon.

Mfg androphinx

Verfasst: 5. März 2009 12:48
von AuE
weil ich das bis eben noch net kannte ;-)

aber das es so Umständlich sein muss das betriebssystem rauszufinden ;-)

Was geben die Fkts zurück wenn ich das falsche BS abfrage?

Code: Alles auswählen

WinVersion QSysInfo::windowsVersion ()   
mit
This enum provides symbolic names for the various versions of the Windows operating system. On Windows, the QSysInfo::WindowsVersion variable gives the version of the system on which the application is run.

MS-DOS-based versions:

Constant Value Description
QSysInfo::WV_32s 0x0001 Windows 3.1 with Win 32s
QSysInfo::WV_95 0x0002 Windows 95
QSysInfo::WV_98 0x0003 Windows 98
QSysInfo::WV_Me 0x0004 Windows Me


NT-based versions:

Constant Value Description
QSysInfo::WV_NT 0x0010 Windows NT
QSysInfo::WV_2000 0x0020 Windows 2000
QSysInfo::WV_XP 0x0030 Windows XP
QSysInfo::WV_2003 0x0040 Windows Server 2003
QSysInfo::WV_VISTA 0x0080 Windows Vista


CE-based versions:

Constant Value Description
QSysInfo::WV_CE 0x0100 Windows CE
QSysInfo::WV_CENET 0x0200 Windows CE .NET
QSysInfo::WV_CE_5 0x0300 Windows CE 5.x
QSysInfo::WV_CE_6 0x0400 Windows CE 6.x


The following masks can be used for testing whether a Windows version is MS-DOS-based, NT-based, or CE-based:

Constant Value Description
QSysInfo::WV_DOS_based 0x000f MS-DOS-based version of Windows
QSysInfo::WV_NT_based 0x00f0 NT-based version of Windows
QSysInfo::WV_CE_based 0x0f00 CE-based version of Windows

da sehe ich kein QSysInfo::NoWindows

Wie erkenne ich denn das ich mich nicht auf dem abgefragten BS befnde?

Verfasst: 5. März 2009 13:20
von pfid
AuE hat geschrieben:
da sehe ich kein QSysInfo::NoWindows

Code: Alles auswählen

#ifdef Q_OS_WIN32
   // toString(QSysInfo::WindowsVersion)
#elif Q_OS_Unix 
     // uname -sr
#elif Q_OS_Mac
   // toString(QSysInfo::MacVersion)
#endif
?

Verfasst: 5. März 2009 13:34
von AuE
ifdef bezieht sich doch auf Präprozessor... und diese werden doch wiederum zur Kompilerlaufzeit und nicht zur programmlaufzeit gesetzt?!

Verfasst: 5. März 2009 13:37
von pfid
AuE hat geschrieben:ifdef bezieht sich doch auf Präprozessor... und diese werden doch wiederum zur Kompilerlaufzeit und nicht zur programmlaufzeit gesetzt?!
Ja und weiter? Willst du dein Mac Programm auf Windows, oder dein Windows Programm auf Linux ausführen? ;)