Delphi: правильное определение номера версии Windows 8.1 и Windows 10 (GetVersionEx)

Этот пост был опубликован мной более года назад. Информация, описанная ниже, уже могла потерять актуальность, но всё ещё может быть полезна.

Я разобрался почему ABTool отображает неверную версию Windows на вкладке «Система». Об этом я написал здесь.

Проблема в том, что для определения версии системы я использовал функцию GetVersionEx. А в ОС Win8.1 и выше эта функция возвращает версию ОС = 6.2.9200. Это чётко описано на этой странице MSDN, смотреть последнюю строку с пометкой *.

* For applications that have been manifested for Windows 8.1 or Windows 10. Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2). To manifest your applications for Windows 8.1 or Windows 10, refer to Targeting your application for Windows.

Всё начинается с того, что необходимо создать (если не было) или изменить файл манифеста, который будет использовать или уже используется в проекте. Этим манифестом «подписывается» программа, exe-файл с целью, попросту говоря, обеспечить систему информацией о совместимости, требованиях (админ. прав, например) и пр.

Чтобы полностью понять, что от тебя требуется сделать, чтобы получить верный код версии системы >= Win8.1, необходимо перейти по последней ссылке. Здесь я скажу лишь то, что мне пришлось только отредактировать существующий файл манифеста следующим образом:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <!-- Эта секция уже есть в твоём манифесте -->
    <application>
      ...
      <!-- Просто добавляешь эти строки -->
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>
  </compatibility>

После компиляции ABTool стала верно отображать версию системы, даже не пришлось менять сам код.

Важно! Прочти этот пост GunSmoker’а: sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1076778&msg=15553937
Из него следует, что использовать GetVersionEx несовсем хорошо, т.к.

Эксперименты показали, что GetVersion(Ex) эмулируются слоем обратной совместимости, а VerifyVersionInfo — нет.

Там же можно посмотреть результаты этого эксперимента.

P.S. Также может оказаться полезной вот эта ссылка: msdn.microsoft.com/ru-ru/library/windows/desktop/dn424972(v=vs.85).aspx

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *