2011-11-11 43 views
3

有什麼辦法可以知道我們正在使用哪個版本的Windows?如何獲得Windows版本是Vista和與德爾福XP對比?

我需要在Windows XP中將圖像設置爲TBitButton,而在Windows7中不需要圖像。它應該自動完成。

+1

你需要讓Windows API調用,具體來說,調用GetVersionEx。快速搜索可以看到這個教程是關於從delphi調用windows api的:http://www.blong.com/Conferences/BorConUK97/WinAPI/Api.htm – VoidStar

+1

@VoidStar:不,你不知道。 :) Delphi自動執行此操作 - 「SysUtils」單元中有多個變量可供您在版本號的各個部分中讀取。如果您正在尋找更多細節,例如您正在使用的版本(專業版,家庭版,服務器等),則只需要「GetVersionEx」。 –

+0

其他答案(由Ken提供)告訴您如何知道Windows Vista及更高版本和Windows 7之間的區別。要準確瞭解Windows的哪個版本,並區分服務器版本和桌面版本,請檢查以下問題:http:/ /stackoverflow.com/questions/57124/how-to-detect-true-windows-version –

回答

10

檢查SysUtils.Win32MajorVersion(在Delphi 7中,如果不存在,則需要將SysUtils添加到uses子句中 - 稍後版本會自動添加它)。最簡單的方法是指定Glyph像往常一樣在IDE中,並清除它,如果你在Vista上運行或更高:

if SysUtils.Win32MajorVersion >= 6 then // Windows Vista or higher 
    BitBtn1.Glyph := nil; 

有關檢測特定的Windows版本和版本的詳細信息,請參閱this post。它尚未針對最新的Windows版本和版本進行更新,但它會幫助您開始。您還可以搜索SO尋找[delphi] GetVersionEx以查看其他示例。

+3

這是檢測Vista/2008及更高版本的方法。注意相關函數CheckWin32Version,因爲在D6中,至少它是不正確的。它已被修復,但我不確定D7。 –

0

這其實是我的一個小項目 - 一個下拉組件,它提供了操作系統的信息 - 即使預覽它在設計時...

unit JDOSInfo; 

interface 

uses 
    Classes, Windows, SysUtils, StrUtils, Forms, Registry; 

type 
    TJDOSInfo = class(TComponent) 
    private 
    fReg: TRegistry; 
    fKey: String; 
    fMinor: Integer; 
    fMajor: Integer; 
    fBuild: Integer; 
    fPlatform: Integer; 
    fIsServer: Bool; 
    fIs64bit: Bool; 
    fProductName: String; 
    function GetProductName: String; 
    procedure SetProductName(Value: String); 
    procedure SetMajor(Value: Integer); 
    procedure SetMinor(Value: Integer); 
    procedure SetBuild(Value: Integer); 
    procedure SetPlatform(Value: Integer); 
    procedure SetIs64Bit(const Value: Bool); 
    procedure SetIsServer(const Value: Bool); 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Major: Integer read fMajor write SetMajor; 
    property Minor: Integer read fMinor write SetMinor; 
    property Build: Integer read fBuild write SetBuild; 
    property Platf: Integer read fPlatform write SetPlatform; 
    property ProductName: String read GetProductName write SetProductName; 
    property IsServer: Bool read fIsServer write SetIsServer; 
    property Is64Bit: Bool read fIs64bit write SetIs64Bit; 
    end; 

function IsWOW64: Boolean; 
function GetOSInfo: TOSVersionInfo; 


procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('JD Custom', [TJDOSInfo]); 
end; 

function GetOSInfo: TOSVersionInfo; 
begin 
    FillChar(Result, SizeOf(Result), 0); 
    Result.dwOSVersionInfoSize := SizeOf(Result); 
    if not GetVersionEx(Result) then 
    raise Exception.Create('Error calling GetVersionEx'); 
end; 

function IsWOW64: Boolean; 
type 
    TIsWow64Process = function(// Type of IsWow64Process API fn 
    Handle: THandle; 
    var Res: BOOL): BOOL; stdcall; 
var 
    IsWow64Result: BOOL;    // result from IsWow64Process 
    IsWow64Process: TIsWow64Process; // IsWow64Process fn reference 
begin 
    // Try to load required function from kernel32 
    IsWow64Process:= GetProcAddress(GetModuleHandle('kernel32'),'IsWow64Process'); 
    if Assigned(IsWow64Process) then 
    begin 
    // Function is implemented: call it 
    if not IsWow64Process(GetCurrentProcess, IsWow64Result) then 
     raise Exception.Create('Bad process handle'); 
    // Return result of function 
    Result := IsWow64Result; 
    end else 
    // Function not implemented: can't be running on Wow64 
    Result:= False; 
end; 

constructor TJDOSInfo.Create(AOwner: TComponent); 
var 
    Info: TOSVersionInfo; 
    Str: String; 
begin 
    inherited Create(AOwner); 
    fReg:= TRegistry.Create(KEY_READ); 
    fReg.RootKey:= HKEY_LOCAL_MACHINE; 
    fKey:= 'Software\Microsoft\Windows NT\CurrentVersion'; 
    fReg.OpenKey(fKey, False); 
    Info:= GetOSInfo; 
    fMajor:= Info.dwMajorVersion; 
    fMinor:= Info.dwMinorVersion; 
    fBuild:= Info.dwBuildNumber; 
    fIsServer:= False; 
    fIs64bit:= False; 
    fPlatform:= Info.dwPlatformId; 
    if fMajor >= 5 then begin 
    //After 2000 
    if fReg.ValueExists('ProductName') then 
     Str:= fReg.ReadString('ProductName') 
    else begin 
     Str:= 'Unknown OS: '+IntToStr(fMajor)+'.'+IntToStr(fMinor)+'.'+ 
     IntToStr(fBuild)+'.'+IntToStr(fPlatform); 
    end;  
    if fReg.ValueExists('InstallationType') then begin 
     if UpperCase(fReg.ReadString('InstallationType')) = 'SERVER' then 
     fIsServer:= True; 
    end; 
    fIs64bit:= IsWOW64; 
    if fIs64bit then 
     Str:= Str + ' 64 Bit'; 
    end else begin 
    //Before 2000 
    case fMajor of 
     4: begin 
     case fMinor of 
      0: Str:= 'Windows 95'; 
      10: Str:= 'Windows 98'; 
      90: Str:= 'Windows ME'; 
     end; 
     end; 
     else begin 
     Str:= 'Older than 95'; 
     end; 
    end; 
    end; 
    Self.fProductName:= Str; 
end; 

destructor TJDOSInfo.Destroy; 
begin 
    if assigned(fReg) then begin 
    if fReg.Active then 
     fReg.CloseKey; 
    fReg.Free; 
    end; 
    inherited Destroy; 
end; 

function TJDOSInfo.GetProductName: String; 
begin 
    Result:= Self.fProductName; 
end; 

procedure TJDOSInfo.SetProductName(Value: String); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetMinor(Value: Integer); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetMajor(Value: Integer); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetBuild(Value: Integer); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetPlatform(Value: Integer); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetIs64Bit(const Value: Bool); 
begin 
    //Do Nothing Here! 
end; 

procedure TJDOSInfo.SetIsServer(const Value: Bool); 
begin 
    //Do Nothing Here! 
end; 

end. 
+3

未能檢測到NT。這段代碼感覺很奇怪。如果分配然後自由?請致電免費。什麼是空的財產製定者? –

+0

不確定NT未檢測到,原始代碼是我找到的其他代碼的位和部分。我總是,我的意思是總是檢查是否在釋放它們之前創建事件,以防萬一(防止訪問衝突)。空屬性設置器允許在設計時顯示屬性。至少在Delphi 7中,您無法發佈只讀屬性。我相信其他更新的版本確實允許,但這是一個只讀技巧。 –

+0

另外,我從來沒有完成它,擱置一段時間,但它足以做Rakesh需要做的事情。 –