Получение версии для Windows? - PullRequest
16 голосов
/ 16 ноября 2011

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

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

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

Заранее спасибо.

Ответы [ 4 ]

36 голосов
/ 16 ноября 2011

В 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-битную ОС.

9 голосов
/ 16 ноября 2011

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

Используя JCL Jedi, вы можете добавить модуль 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-разрядную версию Windows 7 вместо 32-разрядной, позвоните JclSysInfo.IsWindows64.

Обратите внимание, что JCL allso обрабатывает выпуски, такие как 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-разрядного целого со знаком в установщике стало отрицательным, что нарушило установщик. Я должен был установить это в VM, чтобы заставить это работать. Добавление «умного кода» часто делает ваше приложение «глупее». Будьте осторожны.

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

2 голосов
/ 16 ноября 2011

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

1 голос
/ 16 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...