Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi auslesen der windowsversion (https://www.delphipraxis.net/18558-auslesen-der-windowsversion.html)

glkgereon 20. Mär 2004 21:27


auslesen der windowsversion
 
hi
ich muss in einem programm die version der windowsversion auslesesn können
es gibt da in delphi ja sonne konstante, aber laut der hilfe funzt die nur für 95-2000
ich müsste aber auch xp und so bestimmen können
steht da in den registrys nix drin?

Markus K. 20. Mär 2004 21:54

Re: auslesen der windowsversion
 
Hallo glkbkk,
so kannst du prüfen ob das BS Windows XP ist.
Delphi-Quellcode:
var Version:TOSVersionInfo;
begin
     Version.dwOSVersionInfoSize:=SizeOf(OSVersionInfo);
     GetVersionEx(Version);
     if Version.dwPlatformId=VER_PLATFORM_WIN32_NT
     then if ((Version.dwMajorVersion=5)and(Version.dwMinorVersion>=1))
          then ShowMessage('Windows XP');
Tschüß Markus

xineohp 20. Mär 2004 22:01

Re: auslesen der windowsversion
 
hi,

oder du schaust in der Registry unter:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion
bzw. bei NT-Systemen wie XP unter
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion


phoenix

Daniel 20. Mär 2004 22:20

Re: auslesen der windowsversion
 
Es gibt sogar eine API-Funktion dafür. Das wäre der beste Weg.
Steht sogar in der Codelibrary: VersionVersion.

NicoDE 21. Mär 2004 05:35

Re: auslesen der windowsversion
 
Copy 'n Paste :wink:

Delphi-Quellcode:
{$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(StringReplace(GetOSVersionText, #10, ' ', [rfReplaceAll]));
end;

MathiasSimmack 21. Mär 2004 07:34

Re: auslesen der windowsversion
 
Zitat:

Zitat von NicoDE
Copy 'n Paste :wink:

Von mir? :mrgreen: Ich war schneller (s. Beitrag #2). Um Monate ... ;)

NicoDE 21. Mär 2004 07:47

Re: auslesen der windowsversion
 
Zitat:

Zitat von MathiasSimmack
Von mir? :mrgreen: Ich war schneller (s. Beitrag #2). Um Monate ... ;)

Nö :)
Warum hat sich noch keiner über
Delphi-Quellcode:
          if(osvi.szCSDVersion[0] = 'C') or
            (osvi.szCSDVersion[0] = 'B') then Result := Result + 'OSR2 ';
beschwert?
(der szCSDVersion ist in dem Falle ' A ', ' B ', ... - man achte auf die Leerzeichen :))

[edit]
Und eigentlich müsste es bei mir statt
Delphi-Quellcode:
      if (Info.dwMajorVersion = 4) and (Info.dwMinorVersion = 0) then
      begin
eiegntlich
Delphi-Quellcode:
      if (Info.dwMajorVersion = 4) and (Info.dwMinorVersion < 10) then
      begin
heissen, da bei OSR2.1 und OSR2.5 die dwMinorVersion <> 0 ist...

Luckie 21. Mär 2004 10:11

Re: auslesen der windowsversion
 
Hallo Nico,
könntest du mal die {$IFDEF}'s erklären, was das soll und warum die erste Funktion:
Delphi-Quellcode:
function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean;

Andreas L. 21. Mär 2004 10:14

Re: auslesen der windowsversion
 
Etwas kürzer:
----------------

DLL deklarieren:

Delphi-Quellcode:
{$IFDEF WIN32} 
function GetVersionEx(lpOs : pointer) : BOOL; stdcall;
external 'kernel32' name 'GetVersionExA';
{$ENDIF}

Procedure:

Delphi-Quellcode:
procedure GetWindowsVersion(var Major : integer;
                            var Minor : integer);
var
{$IFDEF WIN32}
  lpOS, lpOS2 : POsVersionInfo;
{$ELSE}
  l : longint;
{$ENDIF}
begin
{$IFDEF WIN32}
   GetMem(lpOS, SizeOf(TOsVersionInfo));
   lpOs^.dwOSVersionInfoSize := SizeOf(TOsVersionInfo);
   while getVersionEx(lpOS) = false do begin
     GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1);
     lpOs2^.dwOSVersionInfoSize:= lpOs^.dwOSVersionInfoSize+1;
     FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
     lpOS := lpOs2;
   end;
   Major := lpOs^.dwMajorVersion;
   Minor := lpOs^.dwMinorVersion;
   FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
{$ELSE}
  l := GetVersion;
  Major := LoByte(LoWord(l));
  Minor := HiByte(LoWord(l));
{$ENDIF}
end;
Aufrufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Major : integer;
  Minor : integer;
begin
  GetWindowsVersion(Major, Minor);
  Label1.Caption:=(IntToStr(Major));
  Label2.Caption:=(IntToStr(Minor));
end;
Greetz

Luckie 21. Mär 2004 10:21

Re: auslesen der windowsversion
 
Sagt mal liegt es daran, dass ich nuicht zu Hause bin oder dass es so früh am Morgen ist? warum kapier ich heute nicht, was ihr da codet? Bei Nico wundert es mich eigentlich nicht aber bei dir, onlinehome, sthehen mir irgendwie die haare zu Berge.

Warum das:
Delphi-Quellcode:
{$IFDEF WIN32}
function GetVersionEx(lpOs : pointer) : BOOL; stdcall;
external 'kernel32' name 'GetVersionExA';
{$ENDIF}
Wenn du es eh nirgens benutzt?

Und das:
Delphi-Quellcode:
   while getVersionEx(lpOS) = false do begin
     GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1);
     lpOs2^.dwOSVersionInfoSize:= lpOs^.dwOSVersionInfoSize+1;
     FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
     lpOS := lpOs2;
   end;
Sieht für mich einfach nur grausam aus. Du holst dir so lange Speicher bis es klappt? Das kann doch nicht war sein.

Alles in allem mag deine ja kürzer sein, aber erstens bekommst du so nicht die Version im Klartext und irgend was sagt mir, dass da was ganz fürchterliches im Code passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz