Как определить ОС - PullRequest
       51

Как определить ОС

11 голосов
/ 10 августа 2010

как реализовать функцию, которая будет возвращать имя ОС? определить среду, в которой работает программа?

win2000 / xp / vista / win7 и т.д ...?

Ответы [ 7 ]

20 голосов
/ 10 августа 2010

Примерно так:

function osver: string;
begin
  result := 'Unknown (Windows ' + IntToStr(Win32MajorVersion) + '.' + IntToStr(Win32MinorVersion) + ')';
  case Win32MajorVersion of
    4:
      case Win32MinorVersion of
        0: result := 'Windows 95';
        10: result := 'Windows 98';
        90: result := 'Windows ME';
      end;
    5:
      case Win32MinorVersion of
        0: result := 'Windows 2000';
        1: result := 'Windows XP';
      end;
    6:
      case Win32MinorVersion of
        0: result := 'Windows Vista';
        1: result := 'Windows 7';
        2: result := 'Windows 8';
        3: result := 'Windows 8.1';
      end;
    10:
      case Win32MinorVersion of
        0: result := 'Windows 10';
      end;
  end;
end;

Нет необходимости вызывать GetVersionEx, потому что SysUtils.pas содержит InitPlatformID в своем предложении initialization Следовательно, глобальные константы Win32MajorVersion и Win32MinorVersion (и друзья) будут уже заполнены.

11 голосов
/ 10 августа 2010

В качестве альтернативы Win32 API вы можете использовать WMI Win32_OperatingSystem Class.

вы можете написать простую функцию, подобную этой, чтобы получить имя версии операционной системы Windows.

function  GetWin32_OSName:string;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT Caption FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  Result:=colItem.Caption; //The caption property return an  string  wich includes the operating system version. For example, "Microsoft Windows XP Professional Version = 5.1.2500". 
end;

Дополнительно вы можете получить больше информации о версии Windows, используя другие свойства класса Win32_OperatingSystem.

Проверьте этот код

program GetWMI_Win32_OperatingSystem;

{$APPTYPE CONSOLE}

uses
  SysUtils
  ,ActiveX
  ,ComObj
  ,Variants;


Procedure  GetWin32_OperatingSystem;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  begin
    Writeln('Caption        '+colItem.Caption);
    Writeln('Version        '+colItem.Version);
    Writeln('BuildNumber    '+colItem.BuildNumber);
    Writeln('BuildType      '+colItem.BuildType);
    Writeln('CodeSet        '+colItem.CodeSet);
    Writeln('CountryCode    '+colItem.CountryCode);
    Writeln('BootDevice     '+colItem.BootDevice);
    Writeln;
  end;
end;


function  GetWin32_OSName:string;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT Caption FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  Result:=colItem.Caption;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_OperatingSystem;
      //Writeln(GetWin32_OSName);
      Readln;
    finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.
4 голосов
/ 10 августа 2010

Если вы хотите получить более подробную информацию об операционной системе de, вы можете использовать WMI (код RRUZ использует его в качестве имени).Для получения дополнительной информации вы можете использовать компонент COperatingSystemInfo из GLibWMI (от Sourceforge или Author WebPage (mine) ;-D).
бесплатный и доступный код доступен.Для OperatingSystem вы можете получить следующие свойства:

альтернативный текст http://a.imageshack.us/img594/1660/coperatinsysteminfo.png

С уважением

4 голосов
/ 10 августа 2010

Я использую это в своих программах:

{$J+}
TYPE
  TOperatingSystemClass = (osUntested,osUnknown,osWin95,osWin98,osWinME,osWinNT,osWin2000,osWinXP,osWinXPSP1,osWinXPSP2,osWinXPSP3,osWin2003,osWinVista,osWinVistaSP1,osWinVistaSP2,osWinVistaSP3,osWin7,osWin7SP1,osWin7SP2,osWin7SP3,osHigher);

FUNCTION OperatingSystemClass : TOperatingSystemClass;
  CONST
    OSClass     : TOperatingSystemClass = osUntested;

  VAR
    Info        : OSVERSIONINFOEX;
    OldInfo : OSVERSIONINFO ABSOLUTE Info;

  BEGIN
    IF OSClass=osUntested THEN BEGIN
      FillChar(Info,SizeOf(Info),0);
      Info.dwOSVersionInfoSize:=SizeOf(Info); OSClass:=osUnknown;
      IF NOT GetVersionEx(OldInfo) THEN BEGIN
        FillChar(OldInfo,SizeOf(OldInfo),0);
        OldInfo.dwOSVersionInfoSize:=SizeOf(OldInfo);
        GetVersionEx(OldInfo)
      END;
      CASE Info.dwPlatformId OF
        VER_PLATFORM_WIN32_WINDOWS      : CASE Info.dwMajorVersion OF
                                              3 : OSClass:=osWin95;
                                              4 : CASE Info.dwMinorVersion OF
                                                     0 : OSClass:=osWin95;
                                                    10 : OSClass:=osWin98
                                                  ELSE // OTHERWISE //
                                                    OSClass:=osWinME
                                                  END
                                          END;
        VER_PLATFORM_WIN32_NT           : CASE Info.dwMajorVersion OF
                                              5 : CASE Info.dwMinorVersion OF
                                                    0 : OSClass:=osWin2000;
                                                    1 : OSClass:=osWinXP;
                                                    2 : OSClass:=osWin2003
                                                  END;
                                              6 : IF Info.dwMinorVersion=0 THEN
                                                    OSClass:=osWinVista
                                                  ELSE IF Info.dwMinorVersion=1 THEN
                                                    OSClass:=osWin7
                                                  ELSE
                                                    OSClass:=osHigher
                                            END
      END;
      IF (OSClass IN [osWinXP,osWinVista,osWin7]) AND (Info.wServicePackMajor>0) THEN
        INC(OSClass,MAX(Info.wServicePackMajor,3))
    END;
    Result:=OSClass
  END;

, где

type
  OSVERSIONINFOEX = packed record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: Array [0..127 ] of Char;
    wServicePackMajor: WORD;
    wServicePackMinor: WORD;
    wSuiteMask: WORD;
    wProductType: BYTE;
    wReserved: BYTE;
  End;
  TOSVersionInfoEx = OSVERSIONINFOEX;
  POSVersionInfoEx = ^TOSVersionInfoEx;
1 голос
/ 18 февраля 2011

JCL содержит этот перечисляемый тип:

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

Содержит эту функцию и другие:

function GetWindowsVersion: TWindowsVersion;

Документация здесь

Что еще лучше, когда выходит новая версия Windows, кто-то обновит JCL, и вам не придется расширять этот код самостоятельно.Кроме того, из всех ответов на этот вопрос только JCL обрабатывает обнаружение операционной системы Windows Server в дополнение к обычным версиям окон для конечного пользователя.

0 голосов
/ 11 октября 2017

С Delphi XE2 вы можете использовать TOSVersion запись.Обратите внимание, что это глобальная запись, и вы не можете создавать переменные TOSVersion .

Например:

lblVersion.Caption := TOSVersion.ToString;

У вас есть несколько доступных свойств записи: Minor, Major, Build, Architecture вместе с Platform, который можно использовать для проверки того, что операционная система Windows.

Для сравнения текущей версии системы с определенной., используйте Check версию.

0 голосов
/ 30 января 2014
function OS_IsWindowsXP: Boolean;
begin
 Result:= (Win32MajorVersion= 5) AND (Win32MinorVersion= 1);
end;

function OS_IsWindowsXPUp: Boolean;
begin
 Result:= ((Win32MajorVersion = 5) AND (Win32MinorVersion>= 1))
        OR (Win32MajorVersion>= 6);
end;



function OS_IsWindowsVista: Boolean;
begin
 Result:= (Win32MajorVersion= 6) AND (Win32MinorVersion= 0);
end;

function OS_IsWindowsVistaUp: Boolean;
begin
 Result:= (Win32MajorVersion>= 6);
end;



function OS_IsWindows7: Boolean;
begin
 Result:= (Win32MajorVersion= 6) AND (Win32MinorVersion= 1);
end;

function OS_IsWindows7Up: Boolean;
begin
 Result:= ((Win32MajorVersion = 6) AND (Win32MinorVersion>= 1))   { Any version 6 equal and above Win7 }
        OR (Win32MajorVersion>= 7);                               { Any version above 6 }
end;



function OS_IsWindows8: Boolean;
begin
 Result:= (Win32MajorVersion = 6) AND (Win32MinorVersion= 2);
end;

function OS_IsWindows8Up: Boolean;
begin
 Result:= ((Win32MajorVersion = 6) AND (Win32MinorVersion>= 2))
        OR (Win32MajorVersion>= 7);
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...