Есть такая известная функция получения версии операционной системы 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