[C++] Betriebssystem ermitteln

03/09/2010 16:46 xNopex#1
Im Grunde ist das Ganze nicht schwer zu realisieren. Zuerst enumerieren wir für uns valide OS systeme durch:

Code:
enum
{
    WIN_2000 = 0, WIN_XP, WIN_VISTA, WIN_7
};
Es sollte klar sein, was hier passiert: WIN_2000 ist nun als 0 definiert, Win_XP als 1, WIN_VISTA als 2 und WIN_7 als 3.

Im folgenden habe ich kurz eine Funktion geschrieben, die das OS gemäß unserer Enumeration als Integer-Wert zurückgibt:

Code:
int GetWinVersion()
{
    OSVERSIONINFO info;
    OSVERSIONINFOEX ex;

    ZeroMemory( &info, sizeof( OSVERSIONINFO ) );
    ZeroMemory( &ex, sizeof( OSVERSIONINFOEX ) );
    info.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
    ex.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );

    GetVersionEx( &info );
    GetVersionEx( ( OSVERSIONINFO * ) &ex );

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 0 )
        return WIN_2000;

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 1 )
        return WIN_XP;

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 0 && ex.wProductType == VER_NT_WORKSTATION )
        return WIN_VISTA;

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 1 && ex.wProductType == VER_NT_WORKSTATION )
        return WIN_7;

    return -1;
}
Die Infos zum Bestimmen des OS ( dwMajorVersion, dwMinorVersion, wProductType) erhält man aus dem Mekka der WinAPI Programmierung: MSDN.
Hier mal der Link zu den Strukturen:

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Wenn du die Links verfolgst, findest du eben auch eine Tabelle vor, die die genauen Werte für die Bestimmung des OS enthält.

Joa und das wärs auch schon. Hier noch mal ein kleiner Beispielcode für die Verwendung der Funktion:

Code:
#include <iostream>
#include <windows.h>

using namespace std;

enum
{
    WIN_2000 = 0, WIN_XP, WIN_VISTA,  WIN_7
};

int GetWinVersion();

int main()
{
    int ver = GetWinVersion();

    switch( ver )
    {
        case -1:
            cout << "Unbekannte Win Version...\n";
            break;
        case WIN_2000:
            cout << "Du hast Win2000\n";
            break;
        case WIN_XP:
            cout << "Du hast WinXP\n";
            break;
        case WIN_VISTA:
            cout << "Du hast WinVISTA\n";
            break;
        case WIN_7:
            cout << "Du hast Win7\n";
            break;
    }
    cin.get();
    return 0;
}


int GetWinVersion()
{
    OSVERSIONINFO info;
    OSVERSIONINFOEX ex;

    ZeroMemory( &info, sizeof( OSVERSIONINFO ) );
    ZeroMemory( &ex, sizeof( OSVERSIONINFOEX ) );
    info.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
    ex.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );

    GetVersionEx( &info );
    GetVersionEx( ( OSVERSIONINFO * ) &ex );

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 0 )
        return WIN_2000;

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 1 )
        return WIN_XP;

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 0 && ex.wProductType == VER_NT_WORKSTATION )
        return WIN_VISTA;

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 1 && ex.wProductType == VER_NT_WORKSTATION )
        return WIN_7;

    return -1;
}
10/04/2011 16:52 Logexx#2
THX Nice!
10/04/2011 21:51 KingClem™#3
Da die meisten die sowas hier einbauen/benutzen auf diesen Board mit D3D Menu's Arbeiten ,würde ich es persönlich eher über char ausgeben.

Code:
char cWin   [50] =  {NULL};


		 char GetWinVersion()
{

    OSVERSIONINFO info;
    OSVERSIONINFOEX ex;

    ZeroMemory( &info, sizeof( OSVERSIONINFO ) );
    ZeroMemory( &ex, sizeof( OSVERSIONINFOEX ) );
    info.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
    ex.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );

    GetVersionEx( &info );
    GetVersionEx( ( OSVERSIONINFO * ) &ex );

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 0 )
	{sprintf(cWin,"WIN_2000");}

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 1 )
	{sprintf(cWin,"WIN_XP");}

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 0 && ex.wProductType == VER_NT_WORKSTATION )
	{sprintf(cWin,"WIN_VISTA");}

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 1 && ex.wProductType == VER_NT_WORKSTATION )
	{sprintf(cWin,"WIN_7");}

	sprintf(cWin,"Error");
}
Habe das schnell ohne C umgeschrieben.
10/05/2011 17:55 Brutalon#4
Das hattest du damals auch in deinem Irrlicht Menu :-)
10/15/2011 12:42 MrSm!th#5
Quote:
Originally Posted by KingClem™ View Post
Da die meisten die sowas hier einbauen/benutzen auf diesen Board mit D3D Menu's Arbeiten ,würde ich es persönlich eher über char ausgeben.

Code:
char cWin   [50] =  {NULL};


		 char GetWinVersion()
{

    OSVERSIONINFO info;
    OSVERSIONINFOEX ex;

    ZeroMemory( &info, sizeof( OSVERSIONINFO ) );
    ZeroMemory( &ex, sizeof( OSVERSIONINFOEX ) );
    info.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
    ex.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );

    GetVersionEx( &info );
    GetVersionEx( ( OSVERSIONINFO * ) &ex );

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 0 )
	{sprintf(cWin,"WIN_2000");}

    if( info.dwMajorVersion == 5 && info.dwMinorVersion == 1 )
	{sprintf(cWin,"WIN_XP");}

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 0 && ex.wProductType == VER_NT_WORKSTATION )
	{sprintf(cWin,"WIN_VISTA");}

    if( info.dwMajorVersion == 6 && info.dwMinorVersion == 1 && ex.wProductType == VER_NT_WORKSTATION )
	{sprintf(cWin,"WIN_7");}

	sprintf(cWin,"Error");
}
Habe das schnell ohne C umgeschrieben.
Nur dass deine Funktion fehlerhaft ist und es deutlich schöner wäre, wenn man die Strings in einem Array hätte und den Enumerationswert einfach als Index nutzt, als jeden String in dem if-else-Konstrukt zu kopieren.

Außerdem wäre mir neu, dass man das im Rahmen von D3D Entwicklung als String braucht.
11/11/2011 15:41 Kraizy​#6
Quote:
Originally Posted by Hacker_Elite View Post
Cod MW 3 installer download cracked:
[Only registered and activated users can see links. Click Here To Register...]
Hast du dich verlaufen? Keiner will deinen Keylogger haben..
11/11/2011 21:39 Medix#7
@KingClem™
wtf lol was hat das mit d3d entwicklung zu tun?