Получение версии Windows?

Может ли кто-нибудь помочь мне определить, какую версию Windows может использовать пользователь?

Я видел несколько примеров для этого, но они не обновляются для Vista/7 Operating Systems.

Кроме того, было бы полезно определить, работает ли ОС на архитектуре x32 или x64.

Спасибо заранее.

Ответы

Ответ 1

В XE2 для этого был введен новый класс: TOSVersion.

  • Прочитайте TOSVersion.Architecture, чтобы проверить наличие 32- или 64-разрядной ОС.
  • Прочитайте TOSVersion.Platform для проверки на наличие Windows или Mac.
  • Прочитайте TOSVersion.Major и TOSVersion.Minor для номеров версий.
  • Прочитайте TOSVersion.Name, чтобы получить базовое имя продукта, например. Windows 7.
  • Прочитайте TOSVersion.ToString, чтобы получить полное имя продукта с версией, например. Windows 7 с пакетом обновления 1 (версия 6.1, сборка 7601, 64-разрядная версия).

Для более старых версий Delphi я рекомендую следующее:

Чтобы проверить 2000, XP, Vista, 7, я предлагаю вам читать Win32MajorVersion и Win32MinorVersion.

  • major.minor = 5.0 = > Windows 2000
  • major.minor = 5.1 = > Windows XP
  • major.minor = 5.2 = > Сервер Windows 2003 или XP64
  • major.minor = 6.0 = > Сервер Windows Vista/2008
  • major.minor = 6.1 = > Сервер Windows 7/2008 R2

Такую же информацию можно найти на MSDN, но это было из моей головы!

Если вам нужна очень подробная информация о продукте, это требует немного больше работы. Ответ Уоррена дает один хороший путь для получения этой информации. Если вы хотите проверить возможности, то номера версий в порядке.

Используйте CheckWin32Version, чтобы проверить, превышает ли преобладающая ОС определенный уровень версии. Хотя вы должны проверить, что функция работает правильно в Delphi, поскольку реализация этой функции в Delphi 6 и ранее была неправильной.

Чтобы узнать, что такое архитектура собственной ОС (32 или 64 бит), используйте функцию GetNativeSystemInfo. Эта функция недоступна в старых операционных системах, поэтому вы должны явно ее загрузить с помощью GetProcAddress. Проверить wProcessorArchitecture=PROCESSOR_ARCHITECTURE_AMD64 на наличие 64-разрядной ОС.

Ответ 2

JEDI JCL уже делает это, даже в версиях старше XE2. См. Ответ Дэвида для встроенного решения в XE2 и более поздних версиях.

Используя JEDI JCL, вы можете добавить модуль JclSysInfo и функцию вызова GetWindowsVersion. Он возвращает перечисляемый тип TWindowsVersion.

В настоящее время JCL содержит все отправленные версии Windows и изменяется каждый раз, когда Microsoft отправляет новую версию Windows в поле:

  TWindowsVersion =
   (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
    wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
    wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
    wvWin7, wvWinServer2008R2);

Если вы хотите узнать, используете ли вы 64-разрядные окна 7 вместо 32-разрядных, тогда вызовите JclSysInfo.IsWindows64.

Обратите внимание, что JCL также обрабатывает выпуски, такие как Pro, Ultimate и т.д. Для этого вызова GetWindowsEdition и он возвращает одно из следующих значений:

TWindowsEdition =
   (weUnknown, weWinXPHome, weWinXPPro, weWinXPHomeN, weWinXPProN, weWinXPHomeK,
    weWinXPProK, weWinXPHomeKN, weWinXPProKN, weWinXPStarter, weWinXPMediaCenter,
    weWinXPTablet, weWinVistaStarter, weWinVistaHomeBasic, weWinVistaHomeBasicN,
    weWinVistaHomePremium, weWinVistaBusiness, weWinVistaBusinessN,
    weWinVistaEnterprise, weWinVistaUltimate, weWin7Starter, weWin7HomeBasic,
    weWin7HomePremium, weWin7Professional, weWin7Enterprise, weWin7Ultimate);

Для исторического интереса вы также можете проверить версию уровня NT с помощью функции NtProductType, она возвращает:

 TNtProductType =       (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,        
        ptPersonal, ptProfessional, ptDatacenterServer, 
        ptEnterprise, ptWebEdition);

Обратите внимание, что "N выпусков" обнаружены выше. Это европейская версия Windows, созданная в соответствии с антимонопольными правилами ЕС. Это довольно тонкая градация обнаружения внутри JCL.

Вот примерная функция, которая поможет вам обнаружить Vista и сделать что-то особенное в Vista.

function IsSupported:Boolean;
begin
  case GetWindowsVersion of
     wvVista:  result := false; 
    else
      result := true;
  end;
end;

Обратите внимание, что если вы хотите выполнить проверку "больше, чем", вам следует просто использовать другие методы. Также обратите внимание, что проверка версий часто может быть источником будущего поломки. Обычно я предпочитаю предупреждать пользователей и продолжать, так что мой двоичный код не станет фактическим источником поломки в будущем.

Недавно я попытался установить приложение, и установщик проверил мое свободное место на диске и не установил, потому что у меня было более 2 гигабайт свободного места. 32-битное целочисленное значение в установщике стало отрицательным, сломав программу установки. Мне пришлось установить его в виртуальную машину, чтобы заставить его работать. Добавление "умного кода" часто делает ваше приложение "глупым". Будьте осторожны.

Кстати, я обнаружил, что из командной строки вы можете запустить WMIC.exe и введите path Win32_OperatingSystem ( "Выбор * из Win32_OperatingSystem" не работал у меня). В будущем, возможно, JCL может быть расширен для использования информации WMI.

Ответ 3

Единица (GetWinVersionInfo), показанная здесь, обнаруживает до Vista. Я не могу себе представить, что обновление для Windows 7 было бы трудным. Я не думаю, что он говорит вам x86.x64, хотя.

Ответ 4

На delphidabbler.com есть полная статья о получении версии операционной системы, включая версии с 64 битами. Однако статья не была обновлена, включая Vista/7. Но те же функции могут по-прежнему работать.