2009-11-12 2 views
7

Какова функция для получения даты и времени, когда приложение было выполнено? Я использую Delphi.Когда мое приложение запустилось?

+0

Какое «время запуска»? Можете быть более конкретными? Вы ищете, сколько времени займет ваше приложение? Или в какое время дня оно было начато? –

+1

Да, время дня было начато. –

+1

Питер, ваш вопрос не имеет особого отношения к Delphi, и ответы не являются, поэтому я изменил вопрос, поэтому программисты, не являющиеся разработчиками Delphi, с меньшей вероятностью отклонят его как несущественные, если у них есть аналогичный вопрос. –

ответ

15

Вы можете использовать API вызова Windows, к GetProcessTimes (объявлено в Windows.pas), чтобы получить подробную информацию о любом процессе.

Если это ваше приложение, я бы, скорее всего, сам заработал и зарегистрировал его где-нибудь, чтобы сохранить историю.

+0

+1 для GetProcessTimes – RRUZ

+3

И самый простой способ использовать это DSiGetProcessTimes от DSiWin32, http://gp.17slon.com/gp/dsiwin32.htm. – gabr

4

Я не уверен, есть ли функция или вызов API для этого. Но вы можете легко его подделать. Создайте блок, который выглядит следующим образом:

unit AppStartTime; 

interface 

function GetAppStartTime: TDateTime; 

implementation 
uses 
    SysUtils; 

var 
    fStartTime: TDateTime; 

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

initialization 
    fStartTime := Now; 

end. 

Добавьте его в свой ДПР использует список, в верхней части, либо первый или сразу же после того, как все, что «должно быть первым в списке», такие как пользовательские памяти менеджер.

+1

Если вы хотите быть действительно точным, и ваше приложение имеет длительный старт, тогда поставьте этот блок первым в своем примере использования. –

+1

Если вы хотите быть действительно точным, вам нужно использовать 'GetProcessTimes()', так как даже код при инициализации самого первого блока будет выполнен только после того, как все модули будут загружены и все точки входа модуля будут разрешены , что может занять довольно много времени с низкой пропускной способностью ввода-вывода и без предварительной загрузки или кэширования. – mghie

1

Возможно, ваше приложение зарегистрирует время запуска в текстовом файле или базе данных либо в файле DPR, либо в событии OnCreate() основной формы. Вы можете использовать функцию Delphi Now() для получения текущей даты и времени и форматировать ее как строку с помощью FormatDateTime() или DateTimeToStr(), в зависимости от того, что именно вы хотите сделать.

ниже код сохраняет дату запуска и время во время конструкторе главной формы в текстовый файл в той же папке, что и само приложение под названием StartDateTime.txt:

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

Ваш ответ противоречит Брюсам? –

+0

Peter. Нет. Его ответ близок ко второй части моего ответа, за исключением того, что Кен опубликовал свой первый и включенный исходный код. Если вы решили пойти, вы должны выбрать ответ Кена как правильный. –

+0

Я бы предпочел, чтобы первое предложение ответа было удалено - это явно неправильно. – mghie

2

Использование NtQuerySystemInformation с SystemProcessInformation informationclass, это возвращает массив SYSTEM_PROCESSES структур (записи) из которых CreateTime содержит точное время, когда приложение было начато:

_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; 

Мы уже перевели все это в Jedi Apilib (JwaNative)

+0

Это не структура, документально подтвержденная на MSDN, поэтому я смущаюсь доверять ее точности. –

+1

Ну, Microsoft сохранила эту функцию без документов, и теперь они частично документированы. Структура была отменена очень давно, хотя я думаю, что это очень хорошо использовать. – Remko

+0

Большое спасибо Remko за это, не могли бы вы рассказать нам больше о том, как конвертировать из 'CreateTime' в системное время, это микросекунды с эпохи? PS - Точная структура здесь - 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

Смежные вопросы