Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Windows Version (https://www.delphipraxis.net/188889-windows-version.html)

codenoob 16. Apr 2016 22:53

Windows Version
 
Hi Delphianer

Ich versuche die Windows Version aus der Registry auszulesen.

Delphi-Quellcode:
function GetOsName: string;
var
  VerInfo: TOsversionInfo;
  PlatformId, VersionNumber: string;
  Reg: TRegistry;
begin
  VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
  GetVersionEx(VerInfo);

  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;



  Reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
  PlatformId   := Reg.ReadString('ProductName');
  VersionNumber := Reg.ReadString('CurrentVersion');

  Reg.Free;
  Result := PlatformId + ' (version ' + VersionNumber + ')';
end;
Ich habe hier Windows 7 Ultimate und so steht es auch bei mir in der Registry drinn.
Aber sobald ich den Code ausführe bekomme ich als Wert "Windows XP".

Kennt jemand das Problem und kann mich da auf den Richtigen Weg führen.

Grüsse Tom

Dalai 16. Apr 2016 23:05

AW: Windows Version
 
64 Bit Windows und 32 Bit Delphi Kompilat? Dann schaut dein Programm im falschen Pfad nach, Stichwort WOW64 (es gibt in diesem Zusammenhang für die Registry einen speziellen Terminus, der mir gerade nicht einfällt). Hat dein Programm ein Manifest? Wenn nicht, wird dir das System unter Umständen ein anderes Windows vorgaukeln. Oder führst du deine Software im Kompatibitätsmodus aus?

Davon abgesehen öffnest du mit dem Code den Registry-Schlüssel schreibend, was ohne Adminrechte fehlschlagen wird. Entweder du nutzt Delphi-Referenz durchsuchenTRegistry.OpenKeyReadOnly oder setzt das Flag KEY_READ beim Erzeugen der Instanz in Delphi-Referenz durchsuchenTRegistry.Create.

Unabhängig davon gibt es genügend zuverlässige Funktionen zum Ermitteln der Windows-Version, die ohne Zugriff auf die Registry auskommen. Auch wenn man dort immer das Manifest beim Erscheinen neuer Windows-Versionen pflegen muss (aber oft ändert man sowieso alle paar Jahre was an der eigenen Software, so dass das nicht ins Gewicht fällt).

MfG Dalai

codenoob 16. Apr 2016 23:18

AW: Windows Version
 
Hi Dalai

Also du meinst das ganze wird umgeleitet und der sucht das aus dem HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows NT\CurrentVersion raus?

Das Compilat inst 32 Bit und mein Windows 64.

Hab mal wo was gelesen das es eirgendwie auch über die Kernel32 gehen soll?

386sx 16. Apr 2016 23:29

AW: Windows Version
 
http://www.delphipraxis.net/186147-o...mitteln-3.html

Ab #27 wird's interessanter :)

Luckie 17. Apr 2016 00:38

AW: Windows Version
 
Zitat:

Zitat von Dalai (Beitrag 1335785)
Davon abgesehen öffnest du mit dem Code den Registry-Schlüssel schreibend, was ohne Adminrechte fehlschlagen wird.

Und damit wird das ganze im XP Kompatibilitätsmodus ausgeführt und du bekommst "Windows XP" zurück. Stimmt also wahrscheinlich alles.

codenoob 17. Apr 2016 00:52

AW: Windows Version
 
Wie mach ich den das ganze mit nem Manifest?

Das ist total Neuland für mich.

Hab das was mit nem Manifest versucht aber das funktioniert auch nicht.

Hab mal meinen Code an nen Link gehängt.


http://home.datacomm.ch/masterx/Form mit Manifest.rar

Luckie 17. Apr 2016 01:25

AW: Windows Version
 
Warum öffnest du den Schlüssel nicht einfach READ_ONLY?

codenoob 17. Apr 2016 01:31

AW: Windows Version
 
@Luckye

Du meinst
Delphi-Quellcode:
Reg.Open('\SOFTWARE\Microsoft\Windows\CurrentVersion', false);
in

Delphi-Quellcode:
Reg.OpenKeyREADONLY('\SOFTWARE\Microsoft\Windows\CurrentVersion');
das verändert nichts bekomme als Wert Windows XP zurück.

codenoob 17. Apr 2016 02:23

AW: Windows Version
 
Hab jetzt das ganze mal auf meinem 2. Rechner mit Windows 10 getestet und das ganze schaut also so aus.

Windows 10 Test
---------------
Rückgabewert = Windows 10 (6.2)


Windows 7 Test
--------------
Rückgabewert = Windows XP (5.1)

Also jetzt verstehe ich die Welt nicht mehr Wieso es bei Windows 10 geht und auf Windows 7 bekomme ich nen anderen Wert.:oops:

jaenicke 17. Apr 2016 12:16

AW: Windows Version
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Manifest ist kein gültiges Manifest, sondern nur ein Teil eines Manifests. Dazu kommt, dass du in den Projektoptionen das Standardmanifest aktiviert hast, so dass das aus deiner Ressource ohnehin nicht verwendet wird. Beides alleine verhindert schon, dass das klappt.

Wenn du ein komplettes Manifest erstellst und in den Projektoptionen unter Anwendung als benutzerdefinierte Manifestdatei einbindest, klappt das auch.

Ob das funktioniert, siehst du im Ressourcenmonitor von Windows, wenn du dort in der Prozessliste auf dem Reiter CPU die Spalte Betriebssystemkontext aktiviest. Wie das aussieht (links deine Exe, rechts die mit korrektem Manifest), siehst du hier:

Anhang 45159

Das Manifest, das du unter dem Link findest, ist aber zwar gültig, enthält aber noch nicht die Windows Themes Sektion usw., so dass dein Programm wie unter Windows 98 aussieht. Das müsstest du da noch ergänzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Seite 1 von 2  1 2      

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