有什麼辦法可以知道我們正在使用哪個版本的Windows?如何獲得Windows版本是Vista和與德爾福XP對比?
我需要在Windows XP中將圖像設置爲TBitButton,而在Windows7中不需要圖像。它應該自動完成。
有什麼辦法可以知道我們正在使用哪個版本的Windows?如何獲得Windows版本是Vista和與德爾福XP對比?
我需要在Windows XP中將圖像設置爲TBitButton,而在Windows7中不需要圖像。它應該自動完成。
檢查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
以查看其他示例。
這是檢測Vista/2008及更高版本的方法。注意相關函數CheckWin32Version,因爲在D6中,至少它是不正確的。它已被修復,但我不確定D7。 –
這其實是我的一個小項目 - 一個下拉組件,它提供了操作系統的信息 - 即使預覽它在設計時...
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.
未能檢測到NT。這段代碼感覺很奇怪。如果分配然後自由?請致電免費。什麼是空的財產製定者? –
不確定NT未檢測到,原始代碼是我找到的其他代碼的位和部分。我總是,我的意思是總是檢查是否在釋放它們之前創建事件,以防萬一(防止訪問衝突)。空屬性設置器允許在設計時顯示屬性。至少在Delphi 7中,您無法發佈只讀屬性。我相信其他更新的版本確實允許,但這是一個只讀技巧。 –
另外,我從來沒有完成它,擱置一段時間,但它足以做Rakesh需要做的事情。 –
你需要讓Windows API調用,具體來說,調用GetVersionEx。快速搜索可以看到這個教程是關於從delphi調用windows api的:http://www.blong.com/Conferences/BorConUK97/WinAPI/Api.htm – VoidStar
@VoidStar:不,你不知道。 :) Delphi自動執行此操作 - 「SysUtils」單元中有多個變量可供您在版本號的各個部分中讀取。如果您正在尋找更多細節,例如您正在使用的版本(專業版,家庭版,服務器等),則只需要「GetVersionEx」。 –
其他答案(由Ken提供)告訴您如何知道Windows Vista及更高版本和Windows 7之間的區別。要準確瞭解Windows的哪個版本,並區分服務器版本和桌面版本,請檢查以下問題:http:/ /stackoverflow.com/questions/57124/how-to-detect-true-windows-version –