Может ли кто-нибудь помочь мне определить, какую версию 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.