как реализовать функцию, которая вернет имя ОС? определить среду, в которой работает программа?
win2000/xp/vista/win7 и т.д.??
как реализовать функцию, которая вернет имя ОС? определить среду, в которой работает программа?
win2000/xp/vista/win7 и т.д.??
Что-то вроде этого:
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
(и друзья) будут уже заполнены.
В качестве альтернативы Win32 API вы можете использовать класс Win32_OperatingSystem
.
вы можете написать простую функцию, подобную этой, чтобы получить имя версии операционной операционной системы.
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.
Я использую это в своих программах:
{$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;
Если вы хотите получить дополнительную информацию об операционной системе, вы можете использовать WMI (код RRUZ использует его для имени). Для получения дополнительной информации вы можете использовать компонент COperatingSystemInfo GLibWMI (из Sourceforge или Автор WebPage (мой);-D).
Вся библиотека бесплатна и доступен для sourve. Для OperatingSystem вы можете получить следующие свойства:
alt text http://a.imageshack.us/img594/1660/coperatinsysteminfo.png
Привет
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 в дополнение к обычным версиям окон Windows.
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;
Так как Delphi XE2 вы можете использовать запись TOSVersion
. Обратите внимание, что это глобальная запись и вы не можете создавать переменные TOSVersion.
Например:
lblVersion.Caption := TOSVersion.ToString;
У вас есть несколько свойств записи, доступных для использования: Minor
, Major
, Build
, Architecture
вместе с Platform
, которые вы можете использовать, чтобы убедиться, что операционная система - Windows.
Чтобы сравнить текущую версию системы с определенным, используйте Check
версию.