2009-11-12 12 views
7

Was ist die Funktion, um Datum und Uhrzeit zu erhalten, zu der eine Anwendung ausgeführt wurde? Ich benutze Delphi.Wann wurde meine Anwendung gestartet?

+0

Was "Startzeit"? Kannst du genauer sein? Suchen Sie, wie lange Ihre Bewerbung dauert? Oder zu welcher Tageszeit? –

+1

ja, die Tageszeit, zu der es angefangen wurde. –

+1

Peter, Ihre Frage ist nicht wirklich spezifisch für Delphi und auch nicht die Antworten. Daher habe ich die Frage so geändert, dass es für Nicht-Delphi-Programmierer weniger wahrscheinlich ist, sie als irrelevant abzutun, wenn sie eine ähnliche Frage haben. –

Antwort

15

Sie können den Windows-API-Aufruf GetProcessTimes (in Windows.pas deklariert), um Details für jeden Prozess zu erhalten.

Wenn es Ihre Anwendung, würde ich wahrscheinlich die Startzeit selbst bekommen und es irgendwo einzuloggen eine Geschichte zu halten.

+0

+1 für GetProcessTimes – RRUZ

+3

Und die einfachste Möglichkeit, es zu verwenden, ist DSiGetProcessTimes von DSiWin32, http://gp.17slon.com/gp/dsiwin32.htm. – gabr

4

Ich bin mir nicht sicher, ob es dafür eine Funktion oder einen API-Aufruf gibt. Aber Sie können es ziemlich leicht vortäuschen. Erstellen Sie eine Einheit, die wie folgt aussieht:

unit AppStartTime; 

interface 

function GetAppStartTime: TDateTime; 

implementation 
uses 
    SysUtils; 

var 
    fStartTime: TDateTime; 

function GetAppStartTime: TDateTime; 
begin 
    result := fStartTime; 
end; 

initialization 
    fStartTime := Now; 

end. 

Fügen Sie es zu Ihrem DPR verwendet Liste, an der Spitze, entweder zuerst oder unmittelbar nach etwas, dass „auf der Liste zuerst sein muss“, wie ein benutzerdefinierten Speicher Manager.

+1

Wenn Sie wirklich genau sein wollen, und Ihre Anwendung hat einen langen Start, dann stellen Sie dieses Gerät als erste in Ihrer uses-Klausel. –

+1

Wenn Sie * wirklich * genau sein wollen, müssen Sie 'GetProcessTimes()' verwenden, da selbst der Code in der Initialisierung der allerersten Einheit erst ausgeführt wird, nachdem alle Module geladen und alle Moduleintrittspunkte aufgelöst wurden , die mit geringer E/A-Bandbreite und ohne vorgeladene oder zwischengespeicherte Daten viel Zeit in Anspruch nehmen kann. – mghie

1

Sie können Ihre App einloggen die Startzeit in eine Textdatei oder Datenbank entweder in der DPR-Datei oder in Ihrem Hauptformular OnCreate() Veranstaltung. Sie können Delphis Now() - Funktion verwenden, um das aktuelle Datum und die aktuelle Uhrzeit abzurufen, und sie mit FormatDateTime() oder DateTimeToStr() als Zeichenfolge zu formatieren, je nachdem, was genau Sie tun möchten.

Der folgende Code speichert das Startdatum und die Zeit während der Konstruktor der Hauptform in eine Textdatei im selben Ordner wie die Anwendung selbst StartDateTime.txt genannt:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    SL: TStringList; 
begin 
    SL := TStringList.Create; 
    try 
    SL.Add(FormatDateTime('mm/dd/yyyy hh:nn:ss', Now()); 
    SL.SaveToFile(ExtractFilePath(ParamStr(0)) + 'StartDateTime.txt'); 
    finally 
    SL.Free; 
    end; 
end; 
+0

Widerspricht Ihre Antwort Bruces? –

+0

Peter. Nein. Seine Antwort ist nahe am zweiten Teil meiner Antwort, außer dass Ken seinen ersten und mitgelieferten Quellcode veröffentlicht hat. Wenn Sie sich dafür entscheiden, sollten Sie Kens Antwort als die richtige auswählen. –

+0

Ich würde immer noch lieber den ersten Satz der Antwort entfernt werden - es ist eindeutig falsch. – mghie

2

Verwenden NtQuerySystemInformation mit dem SystemProcessInformation informationclass, gibt diese eine Reihe von SYSTEM_PROCESSES Strukturen (Records), von denen die Create die genaue Uhrzeit enthält, wenn die Anwendungen gestartet wurde:

_SYSTEM_PROCESSES = record // Information Class 5 
    NextEntryDelta: ULONG; 
    ThreadCount: ULONG; 
    Reserved1: array[0..5] of ULONG; 
    CreateTime: LARGE_INTEGER; 
    UserTime: LARGE_INTEGER; 
    KernelTime: LARGE_INTEGER; 
    ProcessName: UNICODE_STRING; 
    BasePriority: KPRIORITY; 
    ProcessId: ULONG; 
    InheritedFromProcessId: ULONG; 
    HandleCount: ULONG; 
    // next two were Reserved2: array [0..1] of ULONG; thanks to Nico Bendlin 
    SessionId: ULONG; 
    Reserved2: ULONG; 
    VmCounters: VM_COUNTERS; 
    PrivatePageCount: ULONG; 
    IoCounters: IO_COUNTERSEX; // Windows 2000 only 
    Threads: array[0..0] of SYSTEM_THREADS; 
    end; 
    SYSTEM_PROCESSES = _SYSTEM_PROCESSES; 
    PSYSTEM_PROCESSES = ^SYSTEM_PROCESSES; 
    TSystemProcesses = SYSTEM_PROCESSES; 
    PSystemProcesses = PSYSTEM_PROCESSES; 

Wir haben bereits all dies übersetzt in die Jedi Apilib (JwaNative)

+0

Das ist nicht die Struktur, die auf MSDN dokumentiert ist, also würde ich zögern, seiner Genauigkeit zu vertrauen. –

+1

Nun, Microsoft hat diese Funktion nicht dokumentiert und jetzt sind sie teilweise dokumentiert. Die Struktur wurde vor sehr langer Zeit umgekehrt, daher denke ich, dass es sehr sicher zu benutzen ist. – Remko

+0

Vielen Dank Remko dafür, können Sie uns bitte mehr darüber erzählen, wie man von 'CreateTime' in Systemzeit umwandelt, ist das die Mikrosekunden seit der Epoche? PS - Die genaue Struktur ist hier - http://processhacker.sourceforge.net/doc/struct___s_y_s_t_e_m___p_r_o_c_e_s_s___i_n_f_o_r_m_a_t_i_o_n.html – Noitidart

Verwandte Themen