FAQ - Windows Version ermitteln



  • hallo leutz,

    zum einen habe ich die bestehende version noch ein wenig ergänzt (Windows XP SP1, Win95x usw.) und zum anderen auch einen anderen weg gefunden um den namen der installierten windows-version zu bestimmen.

    // liefert den namen des betriebssystems zurück
    AnsiString GetOperationSystemName()
    {
      OSVERSIONINFO osinfo;
    
      osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
      if (!GetVersionEx(&osinfo)) return "Unbekannt";
    
      int major = osinfo.dwMajorVersion;
      int minor = osinfo.dwMinorVersion;
      int build = osinfo.dwBuildNumber;
    
      switch(osinfo.dwPlatformId)
      {
        case VER_PLATFORM_WIN32s        : return "Windows 3.1";
    
        case VER_PLATFORM_WIN32_WINDOWS :
    
          if (major == 4)
          {
            if (minor == 0)
            {
              switch(LOWORD(build))
              {
                case  951 : return "Windows 95A (OSR 1.0)";
                case 1111 : return "Windows 95B (OSR 2.0)";
                default   : return "Windows 95";
              }
            }
    
            if (minor == 3)
            {
              switch(LOWORD(build))
              {
                case 1212 : return "Windows 95B (OSR 2.1)";
                case 1214 : return "Windows 95C (OSR 2.5)";
                default   : return "Windows 95";
              }
            }
    
            if (minor == 10)
            {
              switch(LOWORD(build))
              {
                case 1998 : return "Windows 98 (Final Release)";
                case 2000 :
                case 2222 : return "Windows 98 (Second Edition)";
                default   : return "Windows 98";
              }
            }
    
            if (minor == 90)
            {
              switch(LOWORD(build))
              {
                case 3000 : return "Windows ME";
                default   : return "Windows ME";
              }
            }
          }
    
        case VER_PLATFORM_WIN32_NT      :
    
          if (major == 3) return "Windows NT 3.51";
          if (major == 4) return "Windows NT 4.0";
    
          if (major == 5)
          {
            switch(minor)
            {
              case 0 : if (build == 2195) return "Windows 2000";
    
              case 1 :
              {
                switch(build)
                {
                  case 2505 : return "Windows XP";
                  case 2600 : return "Windows XP (Service Pack 1)";
                }
              }
            }
          }
      }
    
      return "Unbekannt";
    }
    

    // 2. version

    // liest den namen des systems aus der registry
    AnsiString GetRegistryOperationSystemName()
    {
      // plattform ermitteln
      OSVERSIONINFO osinfo;
    
      osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
      if (!GetVersionEx(&osinfo)) return -1;
    
      AnsiString  ret  = "";
      DWORD       id   = osinfo.dwPlatformId;
      TRegistry  *reg  = new TRegistry();
    
      // pfad unter dem die info stehen (bei Win9x anderes als bei WinNT???) 
      AnsiString  pfad = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion";
    
      // wenn nt-basiert anderer pfad
      if (id == VER_PLATFORM_WIN32_NT)
        pfad = "\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
    
      // hauptschlüssel
      reg->RootKey = HKEY_LOCAL_MACHINE;
    
      if (reg->OpenKey(pfad, false))
      {
        // den namen des systems und evt. servicepack-namen auslesen
        ret = reg->ReadString("ProductName") + " (" + reg->ReadString("CSDVersion") + ")";
    
    // auch auslesen von folgendem möglich
    //    ProductName    = reg->ReadString("ProductName");
    //    ProductID      = reg->ReadString("ProductId");
    //    ProductVersion = reg->ReadString("CurrentVersion")     + "." +
    //                     reg->ReadString("CurrentBuildNumber") + " " +
    //                     reg->ReadString("SubVersionNumber");
    //    Zusaetze       = reg->ReadString("CSDVersion");
      }
    
      reg->CloseKey();
      delete reg;
    
      return ret;
    }
    

    die 2. variante konnte ich bisher nur unter WinXP (SP1) testen. wäre schön wenn jemand, der ein anderes system besitzt, es mal bei sich ausprobiert und dann bescheid gibt, ob es dort funktioniert, gerade im bezug auf die registry-schlüssel, da ich dort nicht weiss, wie der genaue pfad bei Win9x ist.



  • Also, die Pfade der Regristry sind zumindest bei WIN2000 richtig. Ein
    anderes System hab ich gerade nicht zur Hand..



  • Sunday:
    Wusstest du schon, dass du auch deine Beiträge in der FAQ editieren kannst? Es spräche also nichts dagegen, den Beitrag dort einfach entsprechend zu ändern bzw. zu ergänzen.

    Das wurde den Moderatoren nämlich wieder etwas Arbeit ersparen. 🙂



  • ähm... nö wusste ich nicht. dachte da hamm nur mods zutritt. 😉



  • Das auslesen der Windows-Version aus der Registry ist aber nicht der von Microsoft dokumentierte und empfohlene Weg. Es ist also nicht sicher, dass die Infos auch bei zukünftigen Versionen an dieser Stelle stehen. Du siehst es ja schon bei Windows 9x und den NT-basierenden Systemen, dass die Pfade sich unterscheiden. Gehst du über GetVersionEx solltest du auch in Zukunft auf der sicheren Seite sein.



  • naja, problem bei GetVersionEx ist aber, dass man da keinen namen zurückgeliefert bekommt sondern nur die versionsnummer. ich hab ewig suchen müssen bis ich brauchbare seiten hatte, die die nummern und ihren namen aufzeigt.


  • Mod

    Hallo

    schau doch mal in deiner Struktur den szCSDVersion an

    szCSDVersion[128] ; Beschreibender Text fuer das BS
    (keine Ahnung was da drinnen steht)

    MfG
    Klaus



  • da steht drin: Service Pack 1 oder sowas. das steht aber auch in der Win-API Hilfe!!!

    Windows NT: Contains a null-terminated string, such as "Service Pack 3", that indicates the latest Service Pack installed on the system. If no Service Pack has been installed, the string is empty.

    Windows 95: Contains a null-terminated string that provides arbitrary additional information about the operating system.



  • Wegen der Konstanten in GetVersionEx schau mal hier rein: Registry - SaveKey/ReadKey



  • Hey Mario, alte Socke! Auch mal wieder hier?! 😉


Anmelden zum Antworten