2010-08-10 9 views
11

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 ...?

+3

Uważam, że OP ma więcej informacji, niż mógł kiedykolwiek marzyć! :) –

Odpowiedz

20

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.

+0

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 –

+0

@Daniel Earwicker: Tak, wiem, że to nie jest cała historia (dlatego napisałem "coś takiego" "). Ale to zdecydowanie dobry początek. –

+0

W tym brakuje również wykrycia systemu operacyjnego serwera. –

11

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. 
+0

GetWin32_OSName było tym, czego szukam od 2000 roku :) Shorty i najlepsze. dzięki za uratowanie mojego dnia. –

+0

Należy zauważyć, że jest to obsługiwane tylko w systemie Vista lub nowszym. – Javid

4

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; 
+0

FYI: Brakuje systemów operacyjnych Windows Server. –

4

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

1

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; 

Documentation here

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.

0
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; 
0

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.