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;
Код на языке Delphi, предназначенный для извлечения даты запуска и отключения системы Windows с помощью функции NtQuerySystemInformation API, доступной только в Windows NT и более поздних версиях.
Вот разбивка кода:
Функция GetLastSystemShutdown читает последнюю дату отключения системы из реестра (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows) и конвертирует ее в формат, понятный человеку с помощью функции GetFileTimeToSystemTime.
Функция NtGetBootDateTime использует NtQuerySystemInformation для извлечения даты запуска системы, хранящейся в структуре SYSTEM_TIME_OF_DAY_INFORMATION. Затем она конвертирует это значение в формат, понятный человеку с помощью функций SysDateToStr и SysTimeToStr.
В процедуре FormCreate, эти две функции вызываются, а их результаты отображаются на метках (Label1 и Label2) в графическом интерфейсе пользователя.
Код хорошо структурирован, с ясными именами переменных и комментариями. Однако есть несколько областей, которые можно улучшить:
Обработка ошибок: Хотя код проверяет ошибки при вызове NtQuerySystemInformation и других функций, было бы полезно добавить более явные сообщения об ошибках или журналирование для упрощения отладки любых возникших проблем.
Организация кода: Функция GetFileTimeToSystemTime могла быть вынесена в свой отдельный модуль или файл, чтобы улучшить организацию кода и его повторяемость.
Интерфейс пользователя: Хотя графический интерфейс является хорошим способом отображения результатов, может быть более пользовательски friendly добавить опции для настройки форматов даты или добавления функциональности в UI.
В целом, это код - хороший пример использования NtQuerySystemInformation для извлечения информации о системе в Delphi.
В статье описывается, как узнать дату и время запуска и остановки системы с помощью программирования на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.