AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CMD mit Output

Ein Thema von Willie1 · begonnen am 6. Mär 2019 · letzter Beitrag vom 1. Apr 2019
Antwort Antwort
Seite 4 von 5   « Erste     234 5   
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#31

AW: CMD mit Output

  Alt 26. Mär 2019, 19: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.679 Beiträge
 
Delphi 5 Professional
 
#32

AW: CMD mit Output

  Alt 26. Mär 2019, 20: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 20:13 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

AW: CMD mit Output

  Alt 27. Mär 2019, 05: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
961 Beiträge
 
Delphi 6 Professional
 
#34

AW: CMD mit Output

  Alt 27. Mär 2019, 09: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
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.753 Beiträge
 
Delphi 11 Alexandria
 
#35

AW: CMD mit Output

  Alt 27. Mär 2019, 09:53
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#36

AW: CMD mit Output

  Alt 27. Mär 2019, 11:17
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (27. Mär 2019 um 11:35 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#37

AW: CMD mit Output

  Alt 29. Mär 2019, 10:39
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.
Miniaturansicht angehängter Grafiken
screenshot-2019-03-29-10.12.53.jpg  
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#38

AW: CMD mit Output

  Alt 29. Mär 2019, 16:15
11:47 - Sommerzeit
10:47 - Ortszeit
09:47 - Greenwich mean time (UTC)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#39

AW: CMD mit Output

  Alt 31. Mär 2019, 17:59
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#40

AW: CMD mit Output

  Alt 1. Apr 2019, 09:47
<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>
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:14 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