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.
-
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?!