Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Время старта и завершения работы системы?

Delphi , Синтаксис , Дата и Время

Время старта и завершения работы системы?

Вот так можно узнать дату/время загрузки или завершения работы системы (т.е. когда компьютер был выключен или перезагружен последний раз):

Code:

unit Unit1;

 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
 
type
TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   procedure FormCreate(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
uses Registry;
 
{$R *.dfm}
 
 
type
 
SYSTEM_TIME_OF_DAY_INFORMATION = record
   BootTime: LARGE_INTEGER;
   CurrentTime: LARGE_INTEGER;
   TimeZoneBias: LARGE_INTEGER;
   CurrentTimeZoneId: ULONG;
end;
PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;
 
NTSTATUS = DWORD;
 
const
SystemTimeOfDayInformation =3;
 
function NtQuerySystemInformation(SystemInformationClass:byte;
           SystemInformation: Pointer;
           SystemInformationLength: ULONG;
           ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';
 
 
function SysDateToStr(ST : TSystemTime) : string;
const
sDateFmt = 'dddd, d MMMM, yyyy';
begin
SetLength(Result, 255);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @ST, sDateFmt, @result[1], 255);
SetLength(Result, LStrLen(@result[1]));
end;
 
function SysTimeToStr(ST : TSystemTime):string;
const
sTimeFmt = 'HH:mm:ss' ;
begin
SetLength(result,15);
GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@result[1],15);
SetLength(result, StrLen(@result[1]));
end;
 
function GetFileTimeToSystemTime(ft:TFileTime):string;
var
st,lt:TSystemTime;
tz:TTimezoneInformation;
begin
Result:='';
if not FileTimeToSystemTime(ft, st) then exit;
GetTimeZoneInformation(tz);
SystemTimeToTzSpecificLocalTime(@tz,st,lt);
Result:=SysDateToStr(lt)+'  at  ' + SysTimeToStr(lt);
end;
 
// дата/время последнего выключения (или перезагрузки) системы
function GetLastSystemShutdown:string;
var
ft:TFileTime;
reg:TRegistry;
begin
Result:='';
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if (not reg.OpenKeyReadOnly('System\CurrentControlSet\Control\Windows')) then exit;
if (reg.ReadBinaryData('ShutdownTime',ft,sizeof(ft))=0) then exit
finally
reg.Free
end;
Result:= GetFileTimeToSystemTime(ft)
end;
 
// дата/время старта системы
function NtGetBootDateTime:string;
var
sti : SYSTEM_TIME_OF_DAY_INFORMATION;
status : NTSTATUS;
ftSystemBoot: FILETIME;
ST:TSystemTime;
begin
Result:='';
status:=NtQuerySystemInformation(SystemTimeOfDayInformation, @sti,
                    sizeof(SYSTEM_TIME_OF_DAY_INFORMATION),nil);
if (status<>NO_ERROR) then exit;
ftSystemBoot := PFILETIME(@(sti.BootTime))^;
if FileTimeToLocalFileTime(ftSystemBoot,ftSystemBoot) then
if FileTimeToSystemTime(ftSystemBoot,ST) then
Result:=SysDateToStr(ST)+'  at  '+SysTimeToStr(ST)
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='System start: '+NtGetBootDateTime;
label2.Caption:='Last system shutdown: '+GetLastSystemShutdown;
end;
 
end.

PS: работает только в NT и выше.

Взято из http://forum.sources.ru

Автор: Krid

Код на языке Delphi, предназначенный для извлечения даты запуска и отключения системы Windows с помощью функции NtQuerySystemInformation API, доступной только в Windows NT и более поздних версиях.

Вот разбивка кода:

  1. Функция GetLastSystemShutdown читает последнюю дату отключения системы из реестра (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows) и конвертирует ее в формат, понятный человеку с помощью функции GetFileTimeToSystemTime.
  2. Функция NtGetBootDateTime использует NtQuerySystemInformation для извлечения даты запуска системы, хранящейся в структуре SYSTEM_TIME_OF_DAY_INFORMATION. Затем она конвертирует это значение в формат, понятный человеку с помощью функций SysDateToStr и SysTimeToStr.
  3. В процедуре FormCreate, эти две функции вызываются, а их результаты отображаются на метках (Label1 и Label2) в графическом интерфейсе пользователя.

Код хорошо структурирован, с ясными именами переменных и комментариями. Однако есть несколько областей, которые можно улучшить:

  • Обработка ошибок: Хотя код проверяет ошибки при вызове NtQuerySystemInformation и других функций, было бы полезно добавить более явные сообщения об ошибках или журналирование для упрощения отладки любых возникших проблем.
  • Организация кода: Функция GetFileTimeToSystemTime могла быть вынесена в свой отдельный модуль или файл, чтобы улучшить организацию кода и его повторяемость.
  • Интерфейс пользователя: Хотя графический интерфейс является хорошим способом отображения результатов, может быть более пользовательски friendly добавить опции для настройки форматов даты или добавления функциональности в UI.

В целом, это код - хороший пример использования NtQuerySystemInformation для извлечения информации о системе в Delphi.

В статье описывается, как узнать дату и время запуска и остановки системы с помощью программирования на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Дата и Время ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:58:50/0.0038628578186035/0