Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   CMD mit Output (https://www.delphipraxis.net/199970-cmd-mit-output.html)

Willie1 26. Mär 2019 18:22

AW: CMD mit Output
 
Holger,
es geht um InstallTime nicht InstallDate. InstallTime ist zu groß für Integer auch für Cardinal. Seht es euch an.. Willie.

Dalai 26. Mär 2019 19:08

AW: CMD mit Output
 
Sorry, ich dachte die ganze Zeit, wir reden nur von InstallDate. Mein Win7 hat kein InstallTime in dem genannten Registry-Zweig. Vielleicht eine Neuerung von Win10? Anyway, InstallDate gibt's auch schon bei XP. Insofern ist dieser Wert der wahrscheinlich zuverlässigere.

Und, InstallDate enthält bereits das Datum und die Uhrzeit, eben weil's (sehr wahrscheinlich) ein Unix Timestamp ist.

Grüße
Dalai

HolgerX 27. Mär 2019 04:16

AW: CMD mit Output
 
Hmm..

Und unter meinem WIN8.1 (64Bit) gibt es auch nur 'InstallDate'...

HolgerX 27. Mär 2019 08:23

AW: CMD mit Output
 
Hmm..

So, mal ein bischen recherchiert...

'InstallTime' gibt es nur mit Windows10..

Es ist ein REG_QWORD, somit 64Bit Integer und enthält einen LDAP/FileTime TimeStamp.
Dieser passt unter D6 in einen Int64.

Ich musste meinem D6 erst das Lesen von REG_QWORD beibringen und konnte dann die Zahl mit FileTimeToDateTime in einen DateTime konvertieren.


Delphi-Quellcode:
uses
  Registry, RTLConsts, DateUtils;

const
 KEY_WOW64_64KEY = $0100;
 KEY_WOW64_32KEY = $0200;

const
  REG_QWORD        = 11;

function FileTimeToDateTime(ft: TFileTime): TDateTime; overload;
var
  tzi: TTimeZoneInformation;
  lt, st: TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  FileTimeToSystemTime(ft, st);
  SystemTimeToTzSpecificLocalTime(@tzi, st, lt);
  Result := SystemTimeToDateTime(lt);
end;

function FileTimeToDateTime(ft_Int: Int64): TDateTime; overload;
var
  ft: TFileTime;
begin
  Int64(ft) := ft_Int;
  Result := FileTimeToDateTime(ft);
end;


type
  TRegistryEx      = class(TRegistry)
  public
    function      ReadInt64(const Name: String): Int64;
    procedure     WriteInt64(const Name: String; Value: Int64);
  end;

{ TRegistryEx }

function TRegistryEx.ReadInt64(const Name: String): Int64;
var dwType:       DWORD;
     dwSize:       DWORD;
begin
  dwType:=REG_NONE;
  dwSize:=SizeOf(Int64);
  if (RegQueryValueEx(CurrentKey, PChar(Name), nil, @dwType, PByte(@result), @dwSize) <> ERROR_SUCCESS) then
     raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [Name]);
  if (dwType <> REG_QWORD) then raise ERegistryException.CreateResFmt(@SInvalidRegType, [Name]);
end;

procedure TRegistryEx.WriteInt64(const Name: String; Value: Int64);
var dwType:       DWORD;
     dwSize:       DWORD;
begin
  dwType:=REG_QWORD;
  dwSize:=SizeOf(Int64);
  if (RegSetValueEx(CurrentKey, PChar(Name), 0, dwType, @Value, dwSize) <> ERROR_SUCCESS) then
     raise ERegistryException.CreateResFmt(@SRegSetDataFailed, [Name]);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistryEx;
  tmpInstallDate : Cardinal;
  tmpInstallTime : Int64;
begin
  tmpInstallDate := 0;
  tmpInstallTime := 0;

  Reg := TRegistryEx.Create(KEY_WOW64_64KEY or KEY_ALL_ACCESS);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\Microsoft\Windows NT\CurrentVersion', False) then
    begin
      tmpInstallDate := Reg.ReadInteger('InstallDate');

      if Reg.ValueExists('InstallTime') then
        tmpInstallTime := Reg.ReadInt64('InstallTime');

      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
  Edit1.Text := DateTimeToStr(UnixToDateTime(tmpInstallDate));
  Edit2.Text := DateTimeToStr(FileTimeToDateTime(tmpInstallTime));
end;

Der Source für TRegistryEx stammt von hier:
https://www.experts-exchange.com/que...-registry.html

Den Link zum FileTimeToDateTime mit Int64 habe ich leider verdaddelt...

Sherlock 27. Mär 2019 08:53

AW: CMD mit Output
 
Zitat:

Zitat von hoika (Beitrag 1428683)
Hallo,
Zitat:

Ich will nicht schon wieder Freunde anhauen müssen, zu testen
Es bliebt Dir aber nichts anderes übrig.
Es sei denn, Du hast die Betriebssysteme noch da und kannst sie testweise in einer virtuellen Maschine installieren.

Es gibt da was von Ratiopharm....äh Microsoft:
https://developer.microsoft.com/en-u...dge/tools/vms/

Damit kann man alle noch offiziell unterstützen Win-Versionen zum Testen von *räusper* IE-Funktionalitäten *Zwinker* herunterladen.

Sherlock

Willie1 27. Mär 2019 10:17

AW: CMD mit Output
 
Hallo Holger, Leverkuseen City, da bin ich gestern gewesen.
Ganze Meine Code, werde es checken. Ich habe das auslesen so gemacht: (es klappt)
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var
  Reg: TRegistry;
  Buf: array[0..7] of Byte;
  id: uint64;
  idt: TDateTime;
begin
  FillChar(Buf, SizeOf(Buf),0);
  Reg:=TRegistry.Create(KEY_WOW64_64KEY);
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  if Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion') then begin
    Reg.ReadBinaryData('InstallTime',Buf,SizeOf(Buf));
//    id:=$1d3ea9f6e412ca2; so steht's in der Registry
    Move(Buf,id,SizeOf(id));
//  ab hier komme ich nicht weiter!
    Reg.CloseKey;
  end;
  Reg.Free
end;
Dann wird mir deine Function weiter helfen. Es funktioniert!!!
Sherlock, Danke für den Tipp. Ich werde "Ratiopharm" nicht befragen müssen. Einen Freund kann ich nerven und mein Bruder ist manches von mir gewöhnt. Gruß Willie.

Willie1 29. Mär 2019 09:39

AW: CMD mit Output
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, jetzt zum letzten Mal dieses Thema!:!:
Das Installationsdatum aislesen klappt jetzt, sowohl mit InstallDate als auch mit InstallTime. Nur mit der Zeitzone komme ich nicht klar Mit SystemInfo ermittelt ist Datum-Zeit 13.05.2018 10:47 . Ohne Anpassung ergibt es 09:47 mit der function hier aus dem Forum 11:47. Was ist jetzt richtig?

Delphi-Quellcode:
function DateTimeToLocalTimeDT(dt: TDateTime): TDateTime;
var
  tzi: TTimeZoneInformation;
  lt, st: TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemtime(dt, st);
  SystemTimeToTzSpecificLocalTime(@tzi, st, lt);
  Result := SystemTimeToDateTime(lt);
end;
Willie.

Delphi.Narium 29. Mär 2019 15:15

AW: CMD mit Output
 
11:47 - Sommerzeit
10:47 - Ortszeit
09:47 - Greenwich mean time (UTC)

Willie1 31. Mär 2019 16:59

AW: CMD mit Output
 
Ach so!
Gestern kam durch Zufall das letzte Release-Update von Windows mit neuem Install-Datum, das stimmt. Ist klar, gestern war noch Normalzeit (Winter). Danke für eure Geduld Willie.

Rollo62 1. Apr 2019 08:47

AW: CMD mit Output
 
<OT>
Hat schon jemand einen Algorithmus für eine ausführliche Funktion "IsSommerzeit" zur Berechnung der Zeitverschiebung geschrieben ?

Müsste ja sowas wie "von bis" und das jeweilige Einführungsdatum der verschiedenen Länder berücksichtigen.

Bisher hat ja vielleicht auch einfach grob "Jahr >= 1980" gut funktioniert.

Wenn angeblich die Sommerzeit demnächst in der EU abgeschafft wird sollte man eventuell jetzt schonmal darüber nachdenken, wie man fehlerfrei die "echte" Zeit fehlerfrei in den jeweiligen Zeitzonen berechnen kann.

Ist zwar zum Glück nicht mein aktuelles Thema, könnte es aber vielleicht schnell mal werden.

</OT>


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Seite 4 von 5   « Erste     234 5      

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