bool IsWindowsXP() - schnell



  • Schreib doch einfach im if-Block IsXP = true; und außerhalb dann am Ende return IsXP; 🙄



  • Warum zählst du die Calls mit? Die interessieren doch sowieso keinen. Mach eine BOOL-Variable und setze sie beim ersten Aufruf auf TRUE.



  • Original erstellt von <nutzlos>:
    **return (IsXP==true);
    else
    return (IsXP==false);

    sonst wird doch immer true zurückgegeben**

    Hm nein.

    return (IsXP = false);
    wertet zuerst den Ausdruck aus. Der setzt IsXP auf false und gibt false zurück. Dann gibt das return auch false zurück. In deiner variante gibt die Funktion dann dafür immer genau das falsche zurück, da IsXP anfangs auf false steht 🙂



  • Hi Jungs

    Mit Zuweisung '=' und Vergleich '==' scheint ja bei vielen einhellig Unklarheit zu herrschen!!! 😃

    Das Teil funzt so wie's ist! (Ob sinnvoll oder nicht - ist Ansichtssache)

    Der einzige vernuenftige 'Verbesserungsvorschlag' kam von Flenders.

    @Peter
    Schau Dir mal genau an,was er damit macht! 🕶



  • Was macht er denn damit? Er inkrementiert die Variable sinnlos...



  • @Peter

    ... Und spart sich bei wiederholten Aufrufen die Systemanfrage!!!

    IsXP ist static!!! 😉



  • Da reicht auch eine BOOL Variable, die man einmal auf TRUE setzt...wie gesagt



  • @Peter

    *Da reicht auch eine BOOL Variable, die man einmal auf TRUE setzt...wie gesagt
    *

    Auch wenn's 'mal nicht WindowsXP ist???

    PS: Einmal muss die Version schon abgefragt werden!

    [ Dieser Beitrag wurde am 30.03.2003 um 16:26 Uhr von DerAltenburger editiert. ]



  • Argh, du verstehst mich einfach nicht. 😡 😡

    Anstatt calls eine BOOL-Variable und nicht IsXP auf true



  • Mit Zuweisung '=' und Vergleich '==' scheint ja bei vielen einhellig Unklarheit zu herrschen!!!

    Das Teil funzt so wie's ist! (Ob sinnvoll oder nicht - ist Ansichtssache)

    Das stimmt auch nicht. Das Teil funktioniert nicht. Die Funktion wird immer true liefern.



  • @Peter

    Ach sooooo.

    Dann machts aber doch fast dasselbe?

    Ist doch egal ob zb:

    NotFirst=true;

    oder

    inc calls;

    Die Funktion muss ja wissen, ob's der erste oder ein wiederholter Aufruf ist.
    Und ob's WinXP ist oder nicht muss auch gespeichert werden.



  • - THREAD CLOSED -



  • bool IsWindowsXP() 
    {
        static char IsXP = -1;
    
        if(IsXP == -1) 
        {   
            OSVERSIONINFO osver;
            osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
            GetVersionEx( &osver);
            IsXP = osver.dwMajorVersion == 5 && osver.dwMinorVersion >= 1)
        }
        return IsXP;
    }
    

    oder vielleicht etwas wo der compilier besser optimieren kann

    bool IsWindowsXP() 
    {
        struct foo
        {
            static bool bar()
            {
                OSVERSIONINFO osver;
                osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
                GetVersionEx( &osver);
                return osver.dwMajorVersion == 5 && osver.dwMinorVersion >= 1;
            }
        };
    
        static const bool IsXP = foo::bar();
    
        return IsXP;
    }
    


  • Es wird langsam lächerlich.



  • ...und von welcher Winapi-Funktion bauen wir als nächstes eine ge'cache'te Version? 😃



  • So jetzt tut der Meister sich mal melden *g*
    War den Tag weg, sonst hätte ich vorher ja mal was gesagt.
    Also zur meiner Verteidigung:

    1. Funktioniert das?
    An alle die sagen: return (IsXP=true);
    gäbe true zurück weil die Zuweisung erfolgreich sei,
    haben wohl keine Ahnung was sie hier sagen und nochnie kompakten
    Quellcode gesehen:

    int foo1,foo2,foo3;
       foo1 = foo2 = foo3 = false; // Alle auf false
    

    2.

    Warum zählst du die Calls mit? Die interessieren doch sowieso keinen.
    Mach eine BOOL-Variable und setze sie beim ersten Aufruf auf TRUE.

    Das ist mehr Aufwand:
    1. stdafx.h ändern (extren declaration)
    2. stdafx.cpp ändern(declaration)
    3. Start-Funktion(Wert setzen)
    - Macht das ganze Unübersichtlicher.

    3. Nützlichkeit der Funktion:
    Warum ich diese Funktion geschrieben habe:
    Um bei meine Programme besser an die XP-GUI anzupassen:

    if( IsWindowsXP() ) DoNormalGUI();
        else TryTolookLikeXP();
    

    Mir ist klar das das Einsparen der GetVersionEx-Calls überhaupt nix bringt, aber ich habe das gepostet damit andere Leute was lernen, z.B. wie man eine Funktion dazu bringt einmal was zu berechnen und dann zu chachen(Makros:Nicht zur Laufzeit!). Und es hat ja schon Erfolg gehabt nun wissen einige das return (foo=false) schön false zurück gibt. Sieht man ja bei winsock programing:

    int rc;
    while( (rc=recv(socket,recv_buf,buffer_len,0)) >0)
    ...
    

    ..weißt erst rc den Return-Wert von recv zu und gibt sich selbst weiter.
    Noch ein Dank an "Dimah" die neuimplemntierung gefällt mir ganz gut, wieder was gelernt.
    So zufrieden die Weißheit in Deutschland gesteigert zu haben gehe ich jetzt Bett, bald jedenfalls.... 😉

    Zum Ende noch mein persönlicher Eindruck der User im Forum:
    Das Niveau ist hier net gerade hoch, es gibt ein paar die habens drauf aber der Rest sagt auch was ohne Ahnung.
    z.B. konnte mir keiner bei COM/OLE, MSHTML/ MSXML weiterhelfen. Wo sind da die Profis?
    Egal trozdem gutes Forum, es gibt ja meist Hilfe.
    Also ich wills mir ja net verscheißen mit euch,
    an alle noch schönen Sonntag Abend und viel Spaß beim progen.
    Tristan

    [ Dieser Beitrag wurde am 30.03.2003 um 20:46 Uhr von Tristan editiert. ]



  • Original erstellt von <Peter>:
    Das stimmt auch nicht. Das Teil funktioniert nicht. Die Funktion wird immer true liefern.

    Natürlich stimmt das. Nenne mir einen Grund, warum es immer true liefern soll.

    return (IsXP = false);

    Diese Zeile speichert zuerst false in IsXP, und liefert dann das Ergebnis von IsXP zurück. Nicht anderes.

    **
    1. Funktioniert das?
    An alle die sagen: return (IsXP=true);
    gäbe true zurück weil die Zuweisung erfolgreich sei,
    haben wohl keine Ahnung was sie hier sagen und nochnie kompakten
    Quellcode gesehen:

    int foo1,foo2,foo3;
       foo1 = foo2 = foo3 = false; // Alle auf false
    

    **

    Hat das wer behauptet 😕

    [ Dieser Beitrag wurde am 30.03.2003 um 20:47 Uhr von TriPhoenix editiert. ]



  • Dieser Thread hat wirklich Unterhaltungswert, respekt. Aber eine Frage habe ich noch:

    Um bei meine Programme besser an die XP-GUI anzupassen:

    Und wenn wir dann die Version 6 haben, verwenden wir wieder das 'alte' UI?



  • @TriPhoenix:

    int foo1,foo2,foo3;
    foo1 = foo2 = foo3 = false; // Alle auf false
    Hat das wer behauptet

    Na return (IsXP=false) basiert auf dem gleichen Prinzip wie das mit dem foo in Kette.
    Nur so am Rande.

    Dieser Thread hat wirklich Unterhaltungswert, respekt.
    Ja das finde ich auch.

    Aber eine Frage habe ich noch:
    > >>Um bei meine Programme besser an die XP-GUI anzupassen:
    Und wenn wir dann die Version 6 haben, verwenden wir wieder das 'alte' UI?
    Der wahre Grund warum ich die Funktion geschrieben habe:
    Unter XP laß ich die Progressbar vom System zeichenen, sieht besser aus, aber unter Win9x will ich eine eigene Klasse nehmen die auch ne schöne Bar zeichnet, aber die bei XP zu Fehlern führt.
    Ich denke das mit Version 6 ist kein Problem,1. brauchen die Programme bis dahin net halten, 2. wird es da wieder GUI-Emus geben wie mom bei XP. Also ~6 Jahre wird das XP-GUI wohl noch bei Windows halten. Das alte Design der WinAPI hält ja auch schon seit den 90Jahren.
    Egal ich finde der Thread ist fertig, alles besprochen.
    cu Tristan



  • Ich denke das mit Version 6 ist kein Problem,

    Du hast mich nicht verstanden, denn das ist ganz bestimmt ein Problem. Kann gut sein, daß Deine Funktion bereits auf der nächsten OS-Version nicht mehr true zurückgibt. Und dann benutzt Du in Deinem Programm nicht mehr die neuen UI-Elemente. Der korrekte Vergleich sieht (IMO) so aus:
    [cpp]IsXP = (osver.dwMajorVersion > 5) || (osver.dwMajorVersion == 5 && osver.dwMinorVersion >= 1);[/cpp]


Anmelden zum Antworten