Получение времени загрузки с помощью GetTickCount64 - PullRequest
2 голосов
/ 23 марта 2011

Я пытаюсь извлечь время загрузки, получая структуру SYSTEMTIME текущего времени, затем преобразовывая ее в FILETIME, которую затем преобразовываю в ULARGE_INTEGER, из которой вычитаю GetTickCount64 (), а затем продолжаю преобразовывать все обратно в SYSTEMTIME.1002 * Я сравниваю эту функцию с «NET STATISTICS WORKSTATION», и по какой-то причине мой вывод отключен на несколько часов, что, похоже, не соответствует разнице часовых поясов.

Вот пример кода Visual Studio:

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#define KILOBYTE 1024
#define BUFF KILOBYTE


int _tmain(int argc, _TCHAR* argv[])
{
    ULARGE_INTEGER ticks, ftime;
    SYSTEMTIME current, final;
    FILETIME ft, fout;

    OSVERSIONINFOEX osvi;

    char output[BUFF];
    int retval=0;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    ZeroMemory(&final, sizeof(SYSTEMTIME));
    GetVersionEx((OSVERSIONINFO *) &osvi);

    if (osvi.dwBuildNumber >= 6000) ticks.QuadPart = GetTickCount64();
    else ticks.QuadPart = GetTickCount();
    //Convert miliseconds to 100-nanosecond time intervals
    ticks.QuadPart = ticks.QuadPart * 10000;
    //GetLocalTime(&current); -- //doesn't really fix the problem
    GetSystemTime(&current);
    SystemTimeToFileTime(&current, &ft);
    printf("INITIAL: Filetime lowdatetime %u, highdatetime %u\r\n", ft.dwLowDateTime, ft.dwHighDateTime);
    ftime.LowPart=ft.dwLowDateTime;
    ftime.HighPart=ft.dwHighDateTime;
    //subtract boot time interval from current time
    ftime.QuadPart = ftime.QuadPart - ticks.QuadPart;
    //Convert ULARGE_INT back to FILETIME
    fout.dwLowDateTime = ftime.LowPart;
    fout.dwHighDateTime = ftime.HighPart;
    printf("FINAL: Filetime lowdatetime %u, highdatetime %u\r\n", fout.dwLowDateTime, fout.dwHighDateTime);
    //Convert FILETIME back to system time
    retval = FileTimeToSystemTime(&fout, &final);
    printf("Return value is %d\r\n", retval);
    printf("Current time %d-%.2d-%.2d %.2d:%.2d:%.2d\r\n", current.wYear, current.wMonth, current.wDay,  current.wHour, current.wMinute, current.wSecond);
    printf("Return time %d-%.2d-%.2d %.2d:%.2d:%.2d\r\n", final.wYear, final.wMonth, final.wDay,  final.wHour, final.wMinute, final.wSecond);
    return 0;
}

1 Ответ

2 голосов
/ 24 марта 2011

Я запустил его и обнаружил, что он работает правильно при использовании GetLocalTime в отличие от GetSystemTime, что выражается в UTC.Поэтому было бы разумно, чтобы GetSystemTime не обязательно совпадал с «часами» на ПК.

Кроме этого, проблема может заключаться в вызове GetVersionEx.Как написано, я думаю, что он всегда будет возвращать нули для всех значений.Вам нужна эта строка перед ее вызовом:

osvi.dwOSVersionInfoSize = sizeof( osvi );

В противном случае dwBuildNumber будет равен нулю и будет вызывать GetTickCount, что хорошо только в течение 49 дней или около того.С другой стороны, если бы это было так, я думаю, что вы получили бы результат с гораздо большей разницей.

Я не совсем уверен, что (как написано) проверка необходима для выбора того, какое количество тиковфункция для вызова.Если GetTickCount64 не существует, приложение не будет загружаться из-за отсутствия точки входа (если, возможно, не была использована задержка загрузки ... Я не уверен в этом случае).Я считаю, что было бы необходимо использовать LoadLibrary и GetProcAddress, чтобы динамически принимать решение между этими двумя функциями и заставить его работать на более старой платформе.

...