![]() |
Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
in der ![]() EVEREST Home Edition erkennt aber mein Windows als MCE. Nun meine frage: Wie kann man zw. WinXP Prof und WinXP MCE unterscheiden? Mfg André |
Re: Windows Version ermitteln
versuche die mal nach deinen wünschen umzubauen
Code:
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF Defined(TOSVersionInfoEx)} {$DEFINE TOSVERSIONINFOEX_DEFINED} {$IFEND} {$ENDIF} {$IFNDEF TOSVERSIONINFOEX_DEFINED} type POSVersionInfoEx = ^TOSVersionInfoEx; TOSVersionInfoEx = packed record dwOSVersionInfoSize: DWORD; dwMajorVersion : DWORD; dwMinorVersion : DWORD; dwBuildNumber : DWORD; dwPlatformId : DWORD; szCSDVersion : array [0..127] of AnsiChar; wServicePackMajor : Word; wServicePackMinor : Word; wSuiteMask : Word; wProductType : Byte; wReserved : Byte; end; const VER_SERVER_NT = $80000000; {$EXTERNALSYM VER_SERVER_NT} VER_WORKSTATION_NT = $40000000; {$EXTERNALSYM VER_WORKSTATION_NT} VER_SUITE_SMALLBUSINESS = $00000001; {$EXTERNALSYM VER_SUITE_SMALLBUSINESS} VER_SUITE_ENTERPRISE = $00000002; {$EXTERNALSYM VER_SUITE_ENTERPRISE} VER_SUITE_BACKOFFICE = $00000004; {$EXTERNALSYM VER_SUITE_BACKOFFICE} VER_SUITE_COMMUNICATIONS = $00000008; {$EXTERNALSYM VER_SUITE_COMMUNICATIONS} VER_SUITE_TERMINAL = $00000010; {$EXTERNALSYM VER_SUITE_TERMINAL} VER_SUITE_SMALLBUSINESS_RESTRICTED = $00000020; {$EXTERNALSYM VER_SUITE_SMALLBUSINESS_RESTRICTED} VER_SUITE_EMBEDDEDNT = $00000040; {$EXTERNALSYM VER_SUITE_EMBEDDEDNT} VER_SUITE_DATACENTER = $00000080; {$EXTERNALSYM VER_SUITE_DATACENTER} VER_SUITE_SINGLEUSERTS = $00000100; {$EXTERNALSYM VER_SUITE_SINGLEUSERTS} VER_SUITE_PERSONAL = $00000200; {$EXTERNALSYM VER_SUITE_PERSONAL} VER_SUITE_BLADE = $00000400; {$EXTERNALSYM VER_SUITE_BLADE} VER_SUITE_EMBEDDED_RESTRICTED = $00000800; {$EXTERNALSYM VER_SUITE_EMBEDDED_RESTRICTED} VER_SUITE_SECURITY_APPLIANCE = $00001000; {$EXTERNALSYM VER_SUITE_SECURITY_APPLIANCE} const VER_NT_WORKSTATION = $0000001; {$EXTERNALSYM VER_NT_WORKSTATION} VER_NT_DOMAIN_CONTROLLER = $0000002; {$EXTERNALSYM VER_NT_DOMAIN_CONTROLLER} VER_NT_SERVER = $0000003; {$EXTERNALSYM VER_NT_SERVER} {$ENDIF} // TOSVERSIONINFOEX_DEFINED function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean; begin FillChar(Info, SizeOf(TOSVersionInfoEx), 0); Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx); Result := GetVersionEx(TOSVersionInfo(Addr(Info)^)); if (not Result) then begin FillChar(Info, SizeOf(TOSVersionInfoEx), 0); Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx); Result := GetVersionEx(TOSVersionInfo(Addr(Info)^)); if (not Result) then Info.dwOSVersionInfoSize := 0; end; end; function GetOSVersionText: string; var Info: TOSVersionInfoEx; Key: HKEY; begin Result := ''; if (not GetOSVersionInfo(Info)) then Exit; case Info.dwPlatformId of { Win32s } VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; { Windows 9x } VER_PLATFORM_WIN32_WINDOWS: if (Info.dwMajorVersion = 4) and (Info.dwMinorVersion = 0) then begin Result := 'Microsoft Windows 95'; if (Info.szCSDVersion[1] in ['B', 'C']) then Result := Result +' OSR2'; end else if (Info.dwMajorVersion = 4) and (Info.dwMinorVersion = 10) then begin Result := 'Microsoft Windows 98'; if (Info.szCSDVersion[1] = 'A') then Result := Result + ' SE'; end else if (Info.dwMajorVersion = 4) and (Info.dwMinorVersion = 90) then Result := 'Microsoft Windows Millennium Edition'; { Windows NT } VER_PLATFORM_WIN32_NT: begin { Version } if (Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 2) then Result := 'Microsoft Windows Server 2003' else if (Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 1) then Result := 'Microsoft Windows XP' else if (Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 0) then Result := 'Microsoft Windows 2000' else Result := 'Microsoft Windows NT'; { Extended } if (Info.dwOSVersionInfoSize >= SizeOf(TOSVersionInfoEx)) then begin { ProductType } if (Info.wProductType = VER_NT_WORKSTATION) then begin if (Info.dwMajorVersion = 4) then Result := Result + #10'Workstation 4.0' else if(Info.wSuiteMask and VER_SUITE_PERSONAL <> 0) then Result := Result + #10'Home Edition' else Result := Result + #10'Professional'; end else if (Info.wProductType = VER_NT_SERVER) then begin if (Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 2) then begin if (Info.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + #10'Datacenter Edition' else if (Info.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + #10'Enterprise Edition' else if (Info.wSuiteMask = VER_SUITE_BLADE) then Result := Result + #10'Web Edition' else Result := Result + #10'Standard Edition'; end else if (Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 0) then begin if (Info.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + #10'Datacenter Server' else if (Info.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + #10'Advanced Server' else Result := Result + #10'Server'; end else begin Result := Result + #10'Server ' + IntToStr(Info.dwMajorVersion) + '.' + IntToStr(Info.dwMinorVersion); if (Info.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + ', Enterprise Edition'; end; end; end; { CSDVersion } if (Info.dwMajorVersion = 4) and (StrIComp(Info.szCSDVersion, 'Service Pack 6') = 0) and (RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009', 0, KEY_QUERY_VALUE, Key) = ERROR_SUCCESS) then begin Result := Result + #10'Service Pack 6a'; RegCloseKey(Key); end else Result := Result + #10 + StrPas(Info.szCSDVersion); Result := Result + #10'(Build ' + IntToStr(Info.dwBuildNumber and $FFFF) + ')'; end; end; end; //////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetOSVersionText); end; |
Re: Windows Version ermitteln
Hi delphicus,
deine Antwort löst mein Problem auch nicht. Ich habe auf MSDN mal nachgesehen dort folgendes gefunden: Zitat:
mfg André |
Re: Windows Version ermitteln
10 Sekunden google ergaben 87. ;)
|
Re: Windows Version ermitteln
Hier die Lösung
die Konstante lautet: SM_MEDIACENTER = 87;
Delphi-Quellcode:
Guten nacht euch allen.
//
// taken from PSDK Feb 2003 - "Getting the System version" // (ms-help://MS.PSDK.1033/sysinfo/base/getting_the_system_version.htm) // function GetWinVersion: string; var osvi : TOSVersionInfo; bOsVersionInfoEx : boolean; key : HKEY; szProductType : array[0..79]of char; dwBuflen : dword; begin // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(@osvi,sizeof(TOSVersionInfo)); osvi.dwOSVersionInfoSize := sizeof(TOSVersionInfo); bOsVersionInfoEx := GetVersionEx(osvi); if(not bOsVersionInfoEx) then begin osvi.dwOSVersionInfoSize := VERSIONINFOSIZE; if(not GetVersionEx(osvi)) then begin Result := 'Fehler bei der Ermittlung der Windows-Version'; exit; end; end; case osvi.dwPlatformId of // Test for the Windows NT product family. VER_PLATFORM_WIN32_NT: begin // Test for the specific product family. if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 2) then Result := 'Microsoft Windows Server 2003 family, '; if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 1) then Result := 'Microsoft Windows XP '; if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 0) then Result := 'Microsoft Windows 2000 '; if(osvi.dwMajorVersion <= 4) then Result := 'Microsoft Windows NT '; // Test for specific product on Windows NT 4.0 SP6 and later. if(bOsVersionInfoEx) then begin // Test for the workstation type. if(osvi.wProductType = VER_NT_WORKSTATION) then begin if(osvi.dwMajorVersion = 4) then Result := Result + 'Workstation 4.0 ' else if(osvi.wSuiteMask and VER_SUITE_PERSONAL <> 0) then Result := Result + 'Home Edition ' else Begin // Unterscheidung zw. MCE und Prof. if GetSystemMetrics(SM_MEDIACENTER) <> 0 then Result := Result + 'Media Center Edition ' else Result := Result + 'Professional '; End; end // Test for the server type. else if(osvi.wProductType = VER_NT_SERVER) then begin if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 2) then begin // Win 2003 if(osvi.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + 'Datacenter Edition ' else if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Enterprise Edition ' else if(osvi.wSuiteMask = VER_SUITE_BLADE) then Result := Result + 'Web Edition ' else Result := Result + 'Standard Edition '; end // Win 2000 else if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 0) then begin if(osvi.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + 'Datacenter Server ' else if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Advanced Server ' else Result := Result + 'Server '; end else begin // Windows NT 4.0 if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Server 4.0, Enterprise Edition ' else Result := Result + 'Server 4.0 '; end; end end // Test for specific product on Windows NT 4.0 SP5 and earlier else begin dwBufLen := sizeof(szProductType); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\ProductOptions',0, KEY_QUERY_VALUE,key) = ERROR_SUCCESS) then try ZeroMemory(@szProductType,sizeof(szProductType)); if(RegQueryValueEx(key,'ProductType',nil,nil, @szProductType,@dwBufLen) <> ERROR_SUCCESS) or (dwBufLen > sizeof(szProductType)) then ZeroMemory(@szProductType,sizeof(szProductType)); finally RegCloseKey(key); end; if(lstrcmpi('WINNT',szProductType) = 0) then Result := Result + 'Workstation '; if(lstrcmpi('LANMANNT',szProductType) = 0) then Result := Result + 'Server '; if(lstrcmpi('SERVERNT',szProductType) = 0) then Result := Result + 'Advanced Server '; Result := Format('%s%d.%d',[Result,osvi.dwMajorVersion, osvi.dwMinorVersion]); end; // Display service pack (if any) and build number. if(osvi.dwMajorVersion = 4) and (lstrcmpi(osvi.szCSDVersion,'Service Pack 6') = 0) then begin // Test for SP6 versus SP6a. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009', 0,KEY_QUERY_VALUE,key) = ERROR_SUCCESS) then Result := Format('%sService Pack 6a (Build %d)',[Result, osvi.dwBuildNumber and $ffff]) else // Windows NT 4.0 prior to SP6a Result := Format('%s%s (Build %d)',[Result, osvi.szCSDVersion,osvi.dwBuildNumber and $ffff]); RegCloseKey(key); end // Windows NT 3.51 and earlier or Windows 2000 and later else begin Result := Format('%s%s (Build %d)',[Result, osvi.szCSDVersion,osvi.dwBuildNumber and $ffff]); end; end; // Test for the Windows 95 product family. VER_PLATFORM_WIN32_WINDOWS: begin if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 0) then begin Result := 'Microsoft Windows 95 '; if(osvi.szCSDVersion[0] = 'C') or (osvi.szCSDVersion[0] = 'B') then Result := Result + 'OSR2 '; end; if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 10) then begin Result := 'Microsoft Windows 98 '; if(osvi.szCSDVersion[0] = 'A') then Result:= Result + 'SE '; end; if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 90) then begin Result := 'Microsoft Windows Millennium Edition'; end; end; VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; end; end; André |
Re: Windows Version ermitteln
Hi, das funktioniert super. Jedoch hab ich ne Frage. In Windows Vista, werden sind ja unter anderem auch noch andere Editions enhalten. Wenn man das nun unter Vista anwendet, hab ich mir sagen lassen das dort dann Media Center Edition steht, was ich natürlich nicht haben möchte.
![]() Habe ich nach geschaut und bin jedoch nicht fündig geworden, hat jemand ne idee wie man das mit den Versionen herausbekommen kann, bzw Manuell irgendwie dazu schreiben könnte? |
Re: Windows Version ermitteln
Zitat:
(Wenn du es korrekt haben willst, dann kannst du bei > 5.2 'unbekannte Version' schreiben...) |
Re: Windows Version ermitteln
Ja das weiß ich.
Ich hab zu 6.0 Vista geschrieben, was auch wunderbar funktioniert. Nur wird ausgelesen das es eine Media Center Edition ist, obwohl es sich um einer Ultimate Edition handelt. |
Re: Windows Version ermitteln
Zitat:
|
Re: Windows Version ermitteln
Zitat:
|
Re: Windows Version ermitteln [Update]
Liste der Anhänge anzeigen (Anzahl: 2)
So, ich hab mal ein Update der
![]() Quellen:
Code der unit zum Erkennen von Windows ist im Anhang. Unterstütze Versionen:
Offene Fragen:
Benutzung:
Delphi-Quellcode:
So, dann happy Windowserkenning :zwinker:
uses GetWindowsVersion;
Edit1.Text := GetWinVersion; André |
Re: Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 3)
So, es gibt wieder mal ein Update der Windowserkennungsfunktion.
Neu hinzugekommen ist die Erkennung von:
Unterstütze Versionen:
Offene Fragen:
Quellen:
|
Re: Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Update:
In der neuen Version werden nun die N-Editions von XP (Home-N und Prof-N), WindowsXP 2003 Edition für IA64 und ein paar zusätzliche Betas unterstützt. Auch ein Bug bei der Erkennung von Win95 wurde beseitigt (Thx an Mazel ). Den Support für die K-und KN-Editions hab ich rausgenommen, da der Download von Technet so lahm ist und ich das nicht rechtzeitig testen konnte :wall: Offene Fragen:
André |
Re: Windows Version ermitteln
So ich mache Fortschritt bei der Windowserkennung. Ich bastel gerade eine Komponente dafür.
Nun hab ich noch eine Frage. Wie lese ich die Revisionsnummer der Windowsversion aus? Ich meine diese Nummer: 6000.16386. Die 6000 ist die Buildnummer, da komm ich ran, nur die andere ist schwieriger zu bekommen. Es gibt die Schlüssel BuildLab und BuildLabEx, aber die werden bei einem Update des Kernels erhöht. Diese Nummer brauche ich zur Unterscheidung der Longhorn Server Betas (Dez, feb und April CTP, da diese immer Build 6001 sind und sich nur in der Revisionsnummer unterscheiden :wall: ). hat jemand eine Idee? |
Re: Windows Version ermitteln
Zitat:
EDIT : Als Grundlage zu den ganzen Beiträgen aus hier aus dem Forum, kommt noch die Unit os_info2.pas aus diesem ![]() |
Re: Windows Version ermitteln
Zitat:
|
Re: Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Verstehe ich da etwas falsch. Du möchtest doch die Build-Nummer haben oder ?
Im angehängten Bild siehst Du einen Auszug aus dem Registrykey HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion von einer Windows Vista Business Installation. |
Re: Windows Version ermitteln
Zitat:
|
Re: Windows Version ermitteln
Irgendwie stehe ich auf dem Schlauch. Du möchtest die Revisionsnummer haben. Die steht doch in der Zeichenkette drin. Parse die Zeichenkette doch. Dann hast Du die Nummer.
Du kannst doch die Explodefunktion nehmen und gibts immer die zweite Position aus. Damit hast Du doch dann Deine Nummer oder etwa nicht ? |
Re: Windows Version ermitteln
die ändert sich bei Updates des Kernels!!!!!!!!
Kuck doch mal mein Bild im Album an. Bei den CTPs für Windows Server 2007 ist das kein Problem, doch für die Beta3 wird es Updates geben. Wenn nun ein Sicherheitsproblem festgestellt wird und ein Update kommt, dann ändert sich der String. Nun verstanden wo mein Problem ist? :zwinker: |
Re: Windows Version ermitteln
Wollte die Unit unter einer Konsolen Application verwenden, bekomme aber den Fehler:
Project Project2.exe raised execption class EOIeSysError with message 'CoInitialize wurde nicht aufgerufen'.Process stopped. Use Step or Run to continue. Abhilfe hierfür? |
Re: Windows Version ermitteln
probier mal meine Komponente aus:
![]() Die ist aktueller. |
Re: Windows Version ermitteln
Ist zwar schon ein altes Thema, aber hier noch ein wie ich finde interessanter Link zu dem Thema:
![]() |
Re: Windows Version ermitteln
Ich habe bei dieser Unit das Problem, dass er bei folgender Zeile sagt:
Unkompatible Typen, Array und PWideChar:
Delphi-Quellcode:
// szCSDVersion: array[0..127] of AnsiChar;
(lstrcmpi( osvi.szCSDVersion, 'Service Pack 2') = 0) then |
Re: Windows Version ermitteln
Hi!
Welche Delphi-Version setzt du ein? Ciao, Frederic |
Re: Windows Version ermitteln
Stimmt, habe ich vergessen zu sagen;
Ich verwende RAD 2009 |
Re: Windows Version ermitteln
nimm die folgende Komponente:
![]() Die geht unter Delphi 2009. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz