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

Решение проблемы совместимости кода с 32- и 64-битными версиями Windows: использование `GetTickCount64` в Delphi и Pascal

Delphi , ОС и Железо , Windows

Введение в проблему

Вопрос, который стоит перед разработчиками, работающими с кросс-платформенными проектами, заключается в обеспечении совместимости кода между различными версиями Windows, в частности между 32- и 64-битными системами. Примером такой проблемы является использование прерывания 0x2A для получения времени работы системы, которое не работает в 64-битных версиях Windows.

Описание проблемы

Прерывание 0x2A использовалось для доступа к недокументированной функции KiGetTickCount в 32-битных версиях Windows, что позволяло получить время в миллисекундах, прошедшее с момента старта системы. Однако начиная с Windows Vista, использование этого прерывания стало невозможным в 64-битных системах.

Подтвержденное решение

Для решения проблемы в 64-битных версиях Windows рекомендуется использовать функцию GetTickCount64, которая предназначена для получения времени в миллисекундах, также как и с момента старта системы. Эта функция доступна начиная с Windows Vista и является частью Win32 API.

Альтернативные методы

В качестве альтернативы можно использовать WMI класс Win32_OperatingSystem и свойство LastBootUpTime, которое возвращает время последнего старта системы в формате FILETIME.

Пример кода на Object Pascal

procedure GetSystemUpTime(var Hour, Minute : integer);
var
  LTicks : DWORD;
begin
  LTicks := GetTickCount();
  Hour   := LTicks div 3600000;
  Minute := LTicks mod 3600000 div 60000;
end;

Однако, для использования в 64-битных системах, необходимо модифицировать код следующим образом:

procedure GetSystemUpTime64(var Hour, Minute, Second: Integer);
var
  LTicks64 : Int64;
begin
  LTicks64 := GetTickCount64();
  Hour := LTicks64 div 3600000;
  Minute := LTicks64 mod 3600000 div 60000;
  Second := LTicks64 mod 1000 div 60000;
end;

Обновление (Important Note)

Исследования показали, что прерывание 0x2A и связанная с ним функция KiGetTickCount доступны только в 32-битных версиях Windows. В 64-битных системах структура прерываний отличается, и для получения времени работы системы необходимо использовать другие методы.

Заключение

Для обеспечения совместимости кода между 32- и 64-битными версиями Windows, разработчикам необходимо использовать функции, специфичные для каждой архитектуры. В случае с получением времени работы системы, это означает использование функции GetTickCount в 32-битных системах и GetTickCount64 в 64-битных.

Примечание

При работе с кросс-платформенными проектами важно учитывать различия в API и поведении операционных систем, чтобы обеспечить корректную работу приложения на всех целевых платформах.

Создано по материалам из источника по ссылке.

Разработчики кросс-платформенных проектов сталкиваются с задачей обеспечения совместимости кода между 32- и 64-битными версиями Windows, особенно при использовании недокументированных функций, таких как прерывание 0x2A для получения времени работы систем


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

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




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-28 22:33:16/0.0082788467407227/1