jak zaimplementować funkcję, która zwróci nazwę systemu operacyjnego? wykrywać środowisko, w którym działa program?Jak określić OS
win2000/xp/vista/win7 itd ...?
jak zaimplementować funkcję, która zwróci nazwę systemu operacyjnego? wykrywać środowisko, w którym działa program?Jak określić OS
win2000/xp/vista/win7 itd ...?
coś takiego:
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;
Naprawdę nie ma potrzeby, aby zadzwonić GetVersionEx
ponieważ SysUtils.pas
ma InitPlatformID
w initialization
klauzuli. W związku z tym globalne stałe Win32MajorVersion
i Win32MinorVersion
(i przyjaciół) zostaną już zapełnione.
Bądź bardzo ostrożny, co robisz z oddzielnymi numerami wersji major/minor. Zobacz http://blogs.msdn.com/b/oldnewthing/archive/2004/02/13/72476.aspx –
@Daniel Earwicker: Tak, wiem, że to nie jest cała historia (dlatego napisałem "coś takiego" "). Ale to zdecydowanie dobry początek. –
W tym brakuje również wykrycia systemu operacyjnego serwera. –
Jako alternatywę dla Win32 API można używać klasy WMI Win32_OperatingSystem
.
można napisać prostą funkcję w ten sposób, aby pobrać nazwę wersji systemu operacyjnego 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;
Dodatkowo można uzyskać więcej informacji o wersji systemu Windows, korzystając z innych właściwości klasy Win32_OperatingSystem.
Sprawdź ten kod
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.
GetWin32_OSName było tym, czego szukam od 2000 roku :) Shorty i najlepsze. dzięki za uratowanie mojego dnia. –
Należy zauważyć, że jest to obsługiwane tylko w systemie Vista lub nowszym. – Javid
Używam tego w moich programach:
{$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;
gdzie
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;
FYI: Brakuje systemów operacyjnych Windows Server. –
Jeśli chcesz uzyskać więcej informacji na temat systemu operacyjnego de, można użyć WMI (kod RRUZ używa go dla nazwy). Aby uzyskać więcej informacji, możesz użyć komponentu COperatingSystemInfo z GLibWMI (z Sourceforge lub Author WebPage (moje) ;-D).
Cała biblioteka jest bezpłatna, a kod źródłowy dostępny. Dla SystemOperacyjny można uzyskać te właściwości:
alt text http://a.imageshack.us/img594/1660/coperatinsysteminfo.png
Pozdrowienia
JCL zawiera ten typ wyliczany:
TWindowsVersion =
(wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
wvWin7, wvWinServer2008R2);
zawiera on tę funkcję, i inne:
function GetWindowsVersion: TWindowsVersion;
Co więcej, gdy pojawi się nowa wersja systemu Windows, ktoś zaktualizuje JCL i nie będzie musiał sam rozszerzać tego kodu. Ponadto, ze wszystkich odpowiedzi na to pytanie, tylko JCL obsługuje wykrywanie systemu operacyjnego Windows Server, oprócz zwykłych wersji dla użytkowników końcowych systemu 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;
Od Delphi XE2 można użyć TOSVersion
rekord. Zauważ, że jest to rekord globalny i you cannot create TOSVersion variables.
Na przykład:
lblVersion.Caption := TOSVersion.ToString;
Masz kilka właściwości rekordowe dostępne do użycia: Minor
, Major
, Build
, Architecture
dostarczana wraz ze Platform
, które można wykorzystać, aby upewnić się, że system operacyjny Windows.
Aby porównać aktualną wersję systemu ze zdefiniowaną, należy użyć wersji Check
.
Uważam, że OP ma więcej informacji, niż mógł kiedykolwiek marzyć! :) –