AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CMD mit Output

Ein Thema von Willie1 · begonnen am 6. Mär 2019 · letzter Beitrag vom 1. Apr 2019
Antwort Antwort
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#1

AW: CMD mit Output

  Alt 26. Mär 2019, 17:28
Hmm..

Also bei mir in der Registry ist InstallDate als REG_DWORD angelegt und dies entspricht unter Delphi dem Cardinal (0 bis 4.294.967.295).
Ich denke, da passen noch einige Jahre rein

Und UnixToDateTime verarbeitet nen Int64...
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
698 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: CMD mit Output

  Alt 26. Mär 2019, 18:22
Holger,
es geht um InstallTime nicht InstallDate. InstallTime ist zu groß für Integer auch für Cardinal. Seht es euch an.. Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#3

AW: CMD mit Output

  Alt 26. Mär 2019, 19:08
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

Geändert von Dalai (26. Mär 2019 um 19:13 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#4

AW: CMD mit Output

  Alt 27. Mär 2019, 04:16
Hmm..

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

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#5

AW: CMD mit Output

  Alt 27. Mär 2019, 08:23
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...
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 03:00 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