При работе с Win32 FILETIME учитывайте возможности std::chrono

FILETIME хранит время в единицах по 100 наносекунд относительно собственной эпохи. Ручное объединение полей и деление на константы легко приводят к ошибкам со знаком или единицами измерения. В C++/WinRT можно преобразовать FILETIME в тип часов, а интервал выразить через std::chrono, что упрощает вычисления и снижает риск ошибок.

Пример: целые минуты с использованием C++/WinRT

Ниже приведён самостоятельный фрагмент кода для Windows/C++ с доступными заголовками C++/WinRT. Функция возвращает количество полных минут между сохранённой отметкой FILETIME и текущими системными часами; если сохранённая отметка находится в будущем относительно системного времени, функция возвращает 0.

#include <windows.h>
#include <winrt/base.h>
#include <chrono>
#include <cstdint>

std::int64_t elapsed_minutes(FILETIME changed)
{
    auto earlier = winrt::clock::from_file_time(changed);
    auto current = winrt::clock::now();
    if (current < earlier) return 0;
    return std::chrono::duration_cast<std::chrono::minutes>(
        current - earlier).count();
}

В этом подходе разность вычисляется как текущее время минус сохранённое значение, а duration_cast явно задаёт единицы результата. Возвращаемый std::int64_t позволяет избежать преждевременного сужения результата до меньшего типа. Для измерения продолжительности внутри процесса предпочтительны монотонные часы, а не календарные отметки системного времени.

Альтернативы: Windows Implementation Library предоставляет помощники для работы с FILETIME, включая преобразования в целочисленные представления и константы длительностей. Приведённый пример демонстрирует основной подход с использованием std::chrono и C++/WinRT; сборка в конкретной конфигурации зависит от настроек проекта.