Есть такая известная функция получения версии операционной системы Windows – GetVersionEx, но начиная с версии Windows 8 и выше данная функция работает должным образом только совместно с файлом манифеста.
Создайте новый проект. Сохраните проект с именем p21.dpr. Основной модуль назовите p21_unit1.pas. В каталоге проекта создайте файл манифеста Windows.manifest. Содержимое файла должно быть следующее:
Далее нам необходимо в каталоге проекта создать файл ресурсов компиляции с именем Windows.rc. Содержимое файла компиляции будет следующее:
1 24 "Windows.manifest"
То есть мы в качестве ресурсов нашего приложения указываем наш файл манифеста.
Файл ресурсов компиляции Windows.rc необходимо скомпилировать при помощи компилятора ресурсов brcc32.exe, этот компилятор ресурсов расположен в каталоге, где расположены бинарные файлы Delphi, у меня это каталог D:\Programs\Delphi7\Files\Delphi7\Bin. Убедитесь, что данный каталог добавлен в переменную окружения Path. Запустите командную строку Windows, перейдите в каталог проекта и выполните команду компиляции ресурсов (Смотрите рисунок 1).
brcc32.exe Windows.rc
В качестве результата в каталоге проекта вы получите файл ресурсов Windows.RES, который необходимо в файле проекта p21.dpr подключить. Смотрите код ниже:
Разместите на форме Form1 текстовую метку Lable1. В метке Label1 мы будем отображать версию операционной системы Windows (Смотрите рисунок 2).
В обработчике показа формы Form1 мы метке Label1 присваиваем результат возврата функции WinName.
Рассмотрим две функции, которые получают версию операционной системы Windows.
При помощи функции GetVersionEx мы получаем номер основной и второстепенный для нашей операционной системы Windows. Преобразуем основной и второстепенный номер в строку, выполняем соединение этих строк в одну и возвращаем результат выполнения функции WinVerNum.
При помощи функции WinName мы получаем версию операционной системы Windows и возвращаем ее в виде строки.
Результат работы программы (Смотрите рисунок 3).
Создайте новый проект. Сохраните проект с именем p21.dpr. Основной модуль назовите p21_unit1.pas. В каталоге проекта создайте файл манифеста Windows.manifest. Содержимое файла должно быть следующее:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="App" version="3.1.0.0" processorArchitecture="*"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!--The ID below indicates application support for Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!--The ID below indicates application support for Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!--The ID below indicates application support for Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!--The ID below indicates application support for Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!--The ID below indicates application support for Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility></assembly>
Далее нам необходимо в каталоге проекта создать файл ресурсов компиляции с именем Windows.rc. Содержимое файла компиляции будет следующее:
1 24 "Windows.manifest"
То есть мы в качестве ресурсов нашего приложения указываем наш файл манифеста.
Файл ресурсов компиляции Windows.rc необходимо скомпилировать при помощи компилятора ресурсов brcc32.exe, этот компилятор ресурсов расположен в каталоге, где расположены бинарные файлы Delphi, у меня это каталог D:\Programs\Delphi7\Files\Delphi7\Bin. Убедитесь, что данный каталог добавлен в переменную окружения Path. Запустите командную строку Windows, перейдите в каталог проекта и выполните команду компиляции ресурсов (Смотрите рисунок 1).
brcc32.exe Windows.rc
В качестве результата в каталоге проекта вы получите файл ресурсов Windows.RES, который необходимо в файле проекта p21.dpr подключить. Смотрите код ниже:
Рисунок 1. Создание файла ресурсов
program p21; uses Forms, p21_unit1 in 'p21_unit1.pas' {Form1}; {$R *.res} {$R Windows.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
Разместите на форме Form1 текстовую метку Lable1. В метке Label1 мы будем отображать версию операционной системы Windows (Смотрите рисунок 2).
Рисунок 2. Создание формы приложения
Переходим к написанию кода. Рассмотрим обработчик показа формы Form1, это следующий код:
procedure TForm1.FormShow(Sender: TObject); begin Label1.Caption := WinName; end;
В обработчике показа формы Form1 мы метке Label1 присваиваем результат возврата функции WinName.
Рассмотрим две функции, которые получают версию операционной системы Windows.
function WinVerNum: integer; var ver: TOSVersionInfo; begin ver.dwOSVersionInfoSize := SizeOf(ver); if GetVersionEx(ver) then with ver do result := StrToInt(IntToStr(dwMajorVersion) + '' + IntToStr(dwMinorVersion)); end;
При помощи функции GetVersionEx мы получаем номер основной и второстепенный для нашей операционной системы Windows. Преобразуем основной и второстепенный номер в строку, выполняем соединение этих строк в одну и возвращаем результат выполнения функции WinVerNum.
function WinName: String; begin if WinVerNum = 51 then result := 'Windows XP'; if WinVerNum = 60 then result := 'Windows Vista'; if WinVerNum = 61 then result := 'Windows 7'; if WinVerNum = 62 then result := 'Windows 8'; if WinVerNum = 63 then result := 'Windows 8.1'; if WinVerNum = 100 then result := 'Windows 10'; end;
При помощи функции WinName мы получаем версию операционной системы Windows и возвращаем ее в виде строки.
Результат работы программы (Смотрите рисунок 3).
Рисунок 3. Результат работы программы
Код полностью:
unit p21_unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function WinVerNum: integer; var ver: TOSVersionInfo; begin ver.dwOSVersionInfoSize := SizeOf(ver); if GetVersionEx(ver) then with ver do result := StrToInt(IntToStr(dwMajorVersion) + '' + IntToStr(dwMinorVersion)); end; function WinName: String; begin if WinVerNum = 51 then result := 'Windows XP'; if WinVerNum = 60 then result := 'Windows Vista'; if WinVerNum = 61 then result := 'Windows 7'; if WinVerNum = 62 then result := 'Windows 8'; if WinVerNum = 63 then result := 'Windows 8.1'; if WinVerNum = 100 then result := 'Windows 10'; end; procedure TForm1.FormShow(Sender: TObject); begin Label1.Caption := WinName; end; end.
Всё отлично, но как быть с серверными ОС-ями?
ОтветитьУдалитьС серверными ОС возможности поработать не имею, соответственно код написать и протестировать тоже. Но, в Интернете есть достаточно много примеров кода проверки ОС на принадлежность к серверной ОС. Вот несколько ссылок на фрагменты кода, которые мне удалось найти и надеюсь они вам помогут.
ОтветитьУдалитьhttp://ru-board.club/computers/desktop-programming/143312-38.html
https://coderoad.ru/1268178/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C-%D0%B2-delphi-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E-OS-Windows-7-%D0%B8%D0%BB%D0%B8-Server-2008-R2