Задачка довольно тривиальная - получить время, сколько работает ПК.
Поискал. Нашёл
http://stackoverflow.com/questions/1645896/system-uptime-in-delphi-2009GetTickCount - лимит в 49 дней, доступно с win2000 и по win2003 для 32-битных. Для 64-битных и вообще начиная с Visla соответственно GetTickCount64 надо использовать. Узковатый круг применения.
QueryPerformanceCounter, на сколько понял по поиску, на многопроцессорных или меняющих тактовую частоту процессорах будет выдавать чушь.
Нашёл тему
http://www.codeguru.com/forum/archive/index.php/t-304599.html (пост AdaraCD), попытался адаптировать
#if (defined __WIN32__)
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <tchar.h>
#include <wchar.h>
typedef LONG (WINAPI *pNtQuerySystemInformation)(UINT,PVOID,ULONG,PULONG);
typedef struct _SYSTEM_TIME_OF_DAY_INFORMATION
{
LARGE_INTEGER BootTime;
LARGE_INTEGER CurrentTime;
LARGE_INTEGER TimeZoneBias;
ULONG CurrentTimeZoneId;
} SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION;
#endif
...
#if (defined __WIN32__)
SYSTEMTIME stBootTime;
pNtQuerySystemInformation pfNtQuerySystemInformation;
SYSTEM_TIME_OF_DAY_INFORMATION SysTimeInfo;
FILETIME ftBootTime;
pfNtQuerySystemInformation = (pNtQuerySystemInformation)
GetProcAddress(GetModuleHandle(_T( (const WCHAR*)"ntdll")),"NtQuerySystemInformation");
pfNtQuerySystemInformation(3,&SysTimeInfo,sizeof(SysTimeInfo),0) ;
ftBootTime = *(FILETIME *)&(SysTimeInfo.BootTime);
FileTimeToLocalFileTime(&ftBootTime,&ftBootTime);
FileTimeToSystemTime(&ftBootTime,&stBootTime);
qDebug() << stBootTime.wDay << stBootTime.wHour << stBootTime.wMinute << stBootTime.wSecond;
#endif
Этот вариант просто прибивается виндой.
Потыкался в исходники агента Zabbix - там вообще собственная обвязка под всё, поседеешь, пока разберёшься.
Есть какой-нибудь простой и красивый вариант получить аптайм на винде в Qt?