AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennung
Thema durchsuchen
Ansicht
Themen-Optionen

[Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennung

Ein Thema von MagicAndre1981 · begonnen am 20. Aug 2007 · letzter Beitrag vom 18. Apr 2016
Antwort Antwort
Seite 6 von 6   « Erste     456   
Benutzerbild von MagicAndre1981
MagicAndre1981
Registriert seit: 4. Jun 2004
TWindowsVersionsInfo - Kompo zur Windowserkennung

Version: 1.5

Da mehrfach danach gefragt wurde hab ich mal die Windowserkennng in eine Klasse gepackt, die per Direktive auch als VLC-Kompo auf die Form geklatscht werden kann.

Die Kompo ist nix besonderes, halt nur den Kram, den ich schon für die CodeLib gepostet hatte. Ich hab jetzt die Erkennung der Vista- und Windows Server 2008 Editions ohne WMI implementiert.

Code:
* Kappselung als Kompo/Klasse
* Erkennung der Vista- und Windows Server 2008 Editions ohne WMI implementiert.
+ Erkennung der K(N), N Editions von WIndows XP (Pro, Home) und WIndows Server 2003.
+ Erkennung der Windows XP Embedded
+ Erkennung der Windows Home Server Version ( [url]http://de.wikipedia.org/wiki/Windows_Home_Server[/url])
+ neue Betas werden erkannt
Fix: Fix bei Erkennung der Windows Server 2003 Web Edition
Changelog zur Version 1.0.1:
Code:
- Erkennung der Vista/Server2008 Revision überarbeitet
- Erkennung von Windows Server 2008 RC0/RC1/RTM
- Code lässt sich unter Delphi 2009 compilieren
- Support für Windows 7 / Server 2008 R2
- neue Properties: - Codename
                   - IsBeta
- Erkennung für Windows Vista / Server 2008 Sp2
- Erkennung für neue Windows Server 2008 Editionen
Changelog zur Version 1.0:
Code:
Fix: Units lies sich nicht als nonVCL kompilieren
+    Longhorn M6 4039 Erkennung hinzugefügt
Unterstütze Versionen:
  • Windows 7 (alle SKUs) (die genauen Editionen können sich noch ändern)
  • Windows Server 2008 R2 (alle SKUs)
  • Windows Vista (alle SKUs)
  • Windows Server 2008 (alle SKUs, inclusive EBS, SBS, Hyper-V, HPC)
  • Windows Longhorn Alphas
  • Windows Server 2003 (Standard, Web Edition, Enterprise, DataCenter, Standard Edition for Itanium-based Systems, Enterprise Edition for Itanium-based Systems, DataCenter Edition for Itanium-based Systems, Standard x64 Edition, Enterprise x64 Edition, DataCenter x64 Edition)
  • Windows Server 2003 R2
  • Windows Home Server
  • Windows XP Prof. x64 Edition
  • Windows XP Prof. (K, N)
  • Windows XP Home (K, N)
  • Windows XP Tablet Edition und TabletPC Edition 2005
  • Windows Fundamentals for Legacy PCs
  • Windows XP Media Center Edition alle Versionen (2002, 2004, 2005)
  • Windows 2000 (Prof., Server, DataCenter, Advanced Server + Betas (Codename NT5.0))
  • Windows NT 4 Server (Server, Enterprise Server, Advanced Server)
  • Windows NT 4 Workstation (mit Unterscheidunf zw. SP6 und SP6a)
  • Windows NT 3.51
  • Windows 95 (A,B,C + Betas (Codename: Chicago, Nashville))
  • Windows 98 (Original, SE + Betas (Codename: Memphis))
  • Windows ME (Original + BETA 1 (Codename: Georgia))

Quellen:

Bugs:

Code:
#1: Unit lässt sich als non VCL nicht kompilieren. beseitigt in Version 1.0.1
Aufbau:

Hier gibts eine Liste der Öffentlichen Funktionen Properties.

Delphi-Quellcode:
    function IsWindows2008ServerCore : boolean;
    function IsServer : boolean;
    function IsWorkstation : boolean;
    function IsMediaCenterEdition : boolean;
    function IsTabletPCEdition : boolean;

    property MajorVersion : Byte read FMajorVersion;
    property MinorVersion : Byte read FMinorVersion;
    property BuildNumber : DWORD read FBuild;
    property BuildRevision : DWORD read FBuildRev;
    property ServicePack : string read FServicePack;
    property WindowsVersionsString : string read FFullName;
    property BuildLab : string read FBuildLab;
    property BuildLabEx : string read FBuildLabEx;
    property ServicePackMajor : Byte read FServicePackMajor;
    property ServicePackMinor : Byte read FServicePackMinor;
    property PlatformID : TWinType read FWinType;
    property WindowsVersion : TWindowsVersions read FWindowsVersion;
    property WindowsEdition : TWinEdition read FEdition;
    property IsBeta : boolean read FIsBeta;
    property Codename : string read FCodename;
    property ProcessorArchitecture : TProcessorArchitecture read FProcessorArchitecture;
  end;
Nach dem Erzeugen einer Instanz könnt ihr die verschiendensten Werte abfragen :

Delphi-Quellcode:
wvi := TWindowsVersionInfo.Create(self);

Edit_ComplString.Text := wvi.WindowsVersionsString;
  Edit1.Text := wvi.ServicePack;
  Edit2.Text := IntToStr( wvi.MajorVersion );
  Edit3.Text := IntToStr( wvi.MinorVersion );
  Edit4.Text := IntToStr( wvi.BuildNumber );
und ihr könnt auf spezielle Windowsversionsgruppen abfragen, die als Enum vorliegen:

  if wvi.WindowsVersion = wvWinVista then Damit fragt ihr nach ob das aktuelle OS ein Vista OS ist. Wenn ihr jetzt auf eine spezielle Edition abfragen wollt, dann könnt ihr das Property WindowsEdition auf einen Wert testen:

if wvi.WindowsEdition = weVistaUltimate then // Test auf WIndows Vista Ultimate Die weiteren Werte sind in der Unit zu finden.

Weitere Properties:
Abfrag der Platform (WinNT, WIn9x) und der Processorarchiteture gibts auch als Enums.

So, das sollte das wichtigeste sein damit ihr loslegen könnt.

Besonderen Dank geht an die Tester, die mein Testprogramm vor einigen Wochen getestet haben

Dann hab ich noch die Unit cruStrSplitter.pas genutzt. Von wehm diese ist weiß ich jetzt grad nicht. An diesen User gehen auch Credits.
Angehängte Dateien
Dateityp: 7z bilder_132.7z (2,62 MB, 355x aufgerufen)
Dateityp: zip windowsversionsinfo1.0.1_151.zip (15,7 KB, 344x aufgerufen)
Dateityp: zip windowsversionsinfo1.5_880.zip (26,1 KB, 509x aufgerufen)
"A programmer is just a tool which converts caffeine into code", daran wirds wohl liegen, dass ich Abends nie pennen kann

Zitat von Luckie:
Nicht nur dass ihr offtopic geworden seid, jetzt werdet ihr selber im Offtopic noch offtopic
 
pertzschc

 
Delphi 12 Athens
 
#51
  Alt 26. Feb 2009, 12:05
Zitat von MagicAndre1981:
schalte in der IDE die Option "Bei Delphi Exceptions stoppen" ab.
Das würde ich gerne vermeiden.

Hier ein Vorschlag, wenn es keinerlei Betaversionen/Builds auf dem Rechner ist:

Delphi-Quellcode:
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
    begin
      // begin changed by Christoph
      if (BuildLabEx = '') then begin
        Result := MAXDWORD;
        Exit;
      end;
      // end changed by Christoph
      sp := TStrSplitter.Create;
      try
        try
          sp.Execute(BuildLabEx,'.');
          Result := StrToInt( sp[1] );
        except on E: EConvertError do
          Result := MAXDWORD;
        end;
      finally
        FreeAndNil(sp);
      end;
    end;
Gruß,
Christoph
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#52
  Alt 15. Jun 2009, 11:33
Zitat von MagicAndre1981:
TWindowsVersionsInfo - Kompo zur Windowserkennung
Da mehrfach danach gefragt wurde hab ich mal die Windowserkennng in eine Klasse gepackt, die per Direktive auch als VLC-Kompo auf die Form geklatscht werden kann.
Hallo,
Die TWindowsVersionsInfo finde ich gut. Ich habe sie in einem kleinen Testprogramm benötigt.

Bei der Benutzung sind mir aber ein paar Kleinigkeiten aufgefallen:
  • Ich finde es immer besser einen Fehler zu vermeiden als auf ihn reagieren zu müssen.
    Wenn Du einen EConvertError erwartest weil sp[1] = '', warum prüfst Du denn nicht vorher auf einen korrekten Wert?
    Besser noch Du schaust Dir an wie IntToStr funktioniert und verwendest Val.

    Ich hätte es wahrscheinlich ja gar nicht bemerkt, aber der Delphi Debugger bleibt natürlich immer bei einer Exception stehen. ( -> sehr nervig und unnötig)

    Delphi-Quellcode:
    ...
    // Deine Funktion
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
    begin
      sp := TStrSplitter.Create;
      try
        try
          sp.Execute(BuildLabEx,'.');
          Result := StrToInt( sp[1] );
        except on E: EConvertError do
          Result := MAXDWORD;
        end;
      finally
        FreeAndNil(sp);
      end;
    end;
    ...

    // Mein Vorschlag
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
      E: Integer;
    begin
      sp := TStrSplitter.Create;
      try
        sp.Execute(BuildLabEx,'.');
        Val(sp[1], Result, E);
        if E <> 0 then Result := MAXDWORD;
      finally
        FreeAndNil(sp);
      end;
    end;
    ...
    [edit]
    Ups, ich sehe gerade, dass dieses Problem schon jemand anderes gepostet hat. (Ich hätte nicht nur den 1. Beitrag lesen sollen). Trotzdem ist mein Vortschlag besser als das if str = '' then ...
    [/edit]


    nonVCL
    Du bietest die Option an mit dem Schalter {.$define USE_VCL} nur ein TObjekt statt einer Komponente zu benutzen.
    Die Idee ist super, Du benötigst dann kein Classes und kein Controls und bist damit quasi nonVCL.
    Delphi-Quellcode:
    uses
      SysUtils,
    {$IFDEF USE_VCL}
      Classes, Controls,
    {$ENDIF}
      Windows ;
    Aber Du bist nicht konsequent. Du verwendest die Unit cruStrSplitter, die natürlich Classes einbindet.
    Damit hast Du dann wieder die ganze VCL eingebunden.

    Lösungsvorschlag:
    Nenne Deinen Kompilerschalter einfach um in USE_TCOMPONENT.
    Dann kann sich niemand beschweren.

    oder besser:
    Überarbeite die cruStrSplitter, das diese auch nonVCL wird. Die kleinen *.exe Dateien werden es Dir danken

Ich hoffe diese Infos helfen Dir dein Projekt noch besser zu machen.
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

 
Delphi 7 Enterprise
 
#53
  Alt 15. Jun 2009, 13:23
danke für deine Anregungen, ich schau mir das mal an.
André
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#54
  Alt 15. Jun 2009, 18:41
Zitat von MagicAndre1981:
danke für deine Anregungen, ich schau mir das mal an.
Ich hab mir das auch noch mal angeschaut.

Du verwendest den cruStrSplitter ja nur um aus String wie '123.456.789.0' die Zahl 456 zu bekommen.
Das geht auch mit Copy und Pos(Ex).
  • Pos bestimmt die Position eines SubStr in einem Str.
    Mit i := Pos('.', BuildLabEx); steht in i die Stelle an der der 1. Punkt steht. Bei 123.456.78... ist das 4
    PosEx bestimmt die Position eines SubStr in einem Str ab der x. Stelle (Offset).
    Mit PosEx('.', BuildLabEx, i) bestimmst Du also wie weit der 2. Punkt nach dem 1. steht.
    Bei 123.456.78 mit Offset 4 ist das 4
    Copy(s,x,y) gibt Dir einen SubStr ab der x. Stelle mit der Länge y zurück.

    Copy(BuildLabEx, i+1, PosEx('.', BuildLabEx, i)-1);
    -> i+1 ist das 1. Zeichen nach dem 1. Punkt
    -> PosEx('.', BuildLabEx, i)-1 ist die Länge des SubStr bis zum 2. Punkt. (-1 da der Punkt ja nicht im SubStr enthalten sein soll)
    -> Gibt also '456' zurück

    Glücklicherweise gibt Pos und PosEx eine 0 zurück wenn nichts gefunden wird.
    -> Copy(s, 1, -1) gibt dann einen Leerstring zurück ''
Delphi-Quellcode:
...
    // Vorschlag ohne StrSplitter Objekt
    function GetRevisionFromBuildLabEx: DWORD;
    var
      s: string;
      i: Integer;
      E: Integer;
    begin
      i := Pos('.', BuildLabEx);
      s := Copy(BuildLabEx, i+1, PosEx('.', BuildLabEx, i)-1); // PosEx ist in Unit StrUtils
      Val(s, Result, E);
      if E <> 0 then Result := MAXDWORD;
    end;
...
Damit kannst Du dann ganz auf dieses Objekt verzichten und bist wieder nonVCL.
Es dürfte auch etwas schneller sein als das Splitter Objekt.
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

 
Delphi 7 Enterprise
 
#55
  Alt 15. Jun 2009, 22:18
danke, das bau ich dann ein

dann kommt noch die Windows 7 / Vista Sp2 / Server 2008 (neue Editionen) Erkennung und dann gibts bald wieder ein Update.
André
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#56
  Alt 17. Jun 2009, 15:36
Zitat von MagicAndre1981:
danke, das bau ich dann ein
Gern geschehen.

Das ist jetzt etwas offtopic, aber

http://www.levenez.com/windows/redir...ndows_pdf.html

bzw.

http://www.levenez.com/windows

Viel Spaß
MaBuSE
  Mit Zitat antworten Zitat
TUX_der_Pinguin

 
Delphi 11 Alexandria
 
#57
  Alt 1. Dez 2009, 12:29
Zitat von MagicAndre1981:
danke, das bau ich dann ein

dann kommt noch die Windows 7 / Vista Sp2 / Server 2008 (neue Editionen) Erkennung und dann gibts bald wieder ein Update.
Hi MagicAndre1981,

die Komponente ist echt Super, aber die Frage wäre ob du schon die Zeit gefunden hast die neusten Versionen einzupflegen und ein
Update der Komponente bereitstellen kannst.

Vielen dank

TUX
  Mit Zitat antworten Zitat
WojTec

 
Delphi XE6 Professional
 
#58
  Alt 6. Mär 2013, 19:34
This is very very nice class, but don't support latest Windows. Do you plan update?
  Mit Zitat antworten Zitat
rNoob
 
#59
  Alt 18. Apr 2016, 18:23
Ich habe diese Komponente für mich selber vor Kurzem angepasst. Es werden alle Windows 10-Versionen korrekt ausgelesen.
Try-Except's könnte man mal hier und da einbauen und ein paar weitere Überprüfungen. Aber für meinen Fall war das nicht notwendig.

MagicAndre1981 ist ja leider seit 2009 nicht mehr aktiv. Deswegen wurde in den Credits folgendes von mir hinzugefügt:
Zitat:
(* V1.6.0 (18.04.2016) [Diese Änderung wurde NICHT durch MagicAndre1981 vorgenommen - Fehler gelten ggf. also nicht ihm] *)
(* - Erkennung bis Windows 10 *)
(* V1.6.1 (19.04.2016) [Diese Änderung wurde NICHT durch MagicAndre1981 vorgenommen - Fehler gelten ggf. also nicht ihm] *)
(* - cruStrSplitter entfernt *)
(* - "except on E: EConvertError do"-Blöcke entfernt *)
cruStrSplitter wurde durch die Version von MaBuSE ersetzt: http://www.delphipraxis.net/923631-post54.html #54

Wen diese Version interessiert, sie ist im Anhang zu finden.
Angehängte Dateien
Dateityp: zip WindowsVersion_bis_Win10-1.zip (27,4 KB, 28x aufgerufen)

Geändert von rNoob (19. Apr 2016 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 6   « Erste     456   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
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