Delphi 使用OSVersionInfo的Windows版本
我试图在Delphi XE2中使用OSVersionInfo确定Windows版本,如中所述,我定义了以下代码:Delphi 使用OSVersionInfo的Windows版本,delphi,delphi-xe2,Delphi,Delphi Xe2,我试图在Delphi XE2中使用OSVersionInfo确定Windows版本,如中所述,我定义了以下代码: unit ApplicationWizard01; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrl
unit ApplicationWizard01;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Registry;
type
TMainForm = class(TForm)
BitBtn01: TBitBtn;
Memo01: TMemo;
procedure BitBtn01Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
_OSVERSIONINFOEX : record
dwOSVersionInfoSize : DWORD;
dwMajorVersion : DWORD;
dwMinorVersion : DWORD;
dwBuildNumber : DWORD;
dwPlatformId : DWORD;
szCSDVersion : array[0..127] of AnsiChar;
wServicePackMajor : WORD;
wServicePackMinor : WORD;
wSuiteMask : WORD;
wProductType : BYTE;
wReserved : BYTE;
end;
TOSVERSIONINFOEX : _OSVERSIONINFOEX;
function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL; stdcall; external kernel32;
const
VER_NT_WORKSTATION :Integer = 1;
VER_SUITE_ENTERPRISE :Integer = 2;
VER_NT_SERVER :Integer = 3;
VER_SUITE_DATACENTER :Integer = 128;
VER_SUITE_PERSONAL :Integer = 512;
const
PRODUCT_BUSINESS = $00000006; {Business Edition}
PRODUCT_BUSINESS_N = $00000010; {Business Edition}
PRODUCT_CLUSTER_SERVER = $00000012; {Cluster Server Edition}
PRODUCT_DATACENTER_SERVER = $00000008; {Server Datacenter Edition (Full Installation)}
PRODUCT_DATACENTER_SERVER_CORE = $0000000C; {Server Datacenter Edition (Core Installation)}
PRODUCT_ENTERPRISE = $00000004; {Enterprise Edition}
PRODUCT_ENTERPRISE_N = $0000001B; {Enterprise Edition}
PRODUCT_ENTERPRISE_SERVER = $0000000A; {Server Enterprise Edition (Full Installation)}
PRODUCT_ENTERPRISE_SERVER_CORE = $0000000E; {Server Enterprise Edition (Core Installation)}
PRODUCT_ENTERPRISE_SERVER_IA64 = $0000000F; {Server Enterprise Edition For Itanium Based Systems}
PRODUCT_HOME_BASIC = $00000002; {Home Basic Edition}
PRODUCT_HOME_BASIC_N = $00000005; {Home Basic Edition}
PRODUCT_HOME_PREMIUM = $00000003; {Home Premium Edition}
PRODUCT_HOME_PREMIUM_N = $0000001A; {Home Premium Edition}
PRODUCT_HOME_SERVER = $00000013; {Home Server Edition}
PRODUCT_SERVER_FOR_SMALLBUSINESS = $00000018; {Server For Small Business Edition}
PRODUCT_SMALLBUSINESS_SERVER = $00000009; {Small Business Server}
PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $00000019; {Small Business Server Premium Edition}
PRODUCT_STANDARD_SERVER = $00000007; {Server Standard Edition (Full Installation)}
PRODUCT_STANDARD_SERVER_CORE = $0000000D; {Server Standard Edition (Core Installation)}
PRODUCT_STARTER = $0000000B; {Starter Edition}
PRODUCT_STORAGE_ENTERPRISE_SERVER = $00000017; {Storage Server Enterprise Edition}
PRODUCT_STORAGE_EXPRESS_SERVER = $00000014; {Storage Server Express Edition}
PRODUCT_STORAGE_STANDARD_SERVER = $00000015; {Storage Server Standard Edition}
PRODUCT_STORAGE_WORKGROUP_SERVER = $00000016; {Storage Server Workgroup Edition}
PRODUCT_UNDEFINED = $00000000; {An Unknown Product}
PRODUCT_ULTIMATE = $00000001; {Ultimate Edition}
PRODUCT_ULTIMATE_N = $0000001C; {Ultimate Edition}
PRODUCT_WEB_SERVER = $00000011; {Web Server Edition}
PRODUCT_UNLICENSED = $ABCDABCD; {Unlicensed Product}
implementation
{$R *.dfm}
var
{$EXTERNALSYM GetProductInfo}
GetProductInfo: function (dwOSMajorVersion, dwOSMinorVersion,
dwSpMajorVersion, dwSpMinorVersion: DWORD;
var pdwReturnedProductType: DWORD): BOOL stdcall = NIL;
function GetOSInfo: string;
var
NTBres, BRes: Boolean;
OSVI: TOSVERSIONINFO;
OSVI_NT: TOSVERSIONINFOEX;
tmpStr: string;
dwOSMajorVersion, dwOSMinorVersion,
dwSpMajorVersion, dwSpMinorVersion,
pdwReturnedProductType : DWORD;
begin
Result := 'Error';
NTBRes := FALSE;
try
OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX);
NTBRes := GetVersionExA(OSVI_NT);
OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
BRes := GetVersionEx(OSVI);
except
OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
BRes := GetVersionEx(OSVI);
end;
if (not BRes) and (not NTBres) then
Exit;
Move( OSVI, OSVI_NT, SizeOf(TOSVersionInfo) );
case OSVI_NT.dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
if OSVI_NT.dwMajorVersion <= 4 then
Result := 'Windows NT ';
if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then
Result := 'Windows 2000 ';
if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then
Result := 'Windows XP ';
if (OSVI_NT.dwMajorVersion = 6) and (OSVI_NT.dwMinorVersion = 0) then
begin
Result := 'Windows Vista ';
if Assigned(GetProductInfo) then
begin
GetProductInfo( dwOSMajorVersion, dwOSMinorVersion,
dwSpMajorVersion, dwSpMinorVersion,
pdwReturnedProductType );
case pdwReturnedProductType of
PRODUCT_BUSINESS:
tmpStr := 'Business Edition';
PRODUCT_BUSINESS_N:
tmpStr := 'Business Edition';
PRODUCT_CLUSTER_SERVER:
tmpStr := 'Cluster Server Edition';
PRODUCT_DATACENTER_SERVER:
tmpStr := 'Server Datacenter Edition (full installation)';
PRODUCT_DATACENTER_SERVER_CORE:
tmpStr := 'Server Datacenter Edition (core installation)';
PRODUCT_ENTERPRISE:
tmpStr := 'Enterprise Edition';
PRODUCT_ENTERPRISE_N:
tmpStr := 'Enterprise Edition';
PRODUCT_ENTERPRISE_SERVER:
tmpStr := 'Server Enterprise Edition (full installation)';
PRODUCT_ENTERPRISE_SERVER_CORE:
tmpStr := 'Server Enterprise Edition (core installation)';
PRODUCT_ENTERPRISE_SERVER_IA64:
tmpStr := 'Server Enterprise Edition for Itanium-based Systems';
PRODUCT_HOME_BASIC:
tmpStr := 'Home Basic Edition';
PRODUCT_HOME_BASIC_N:
tmpStr := 'Home Basic Edition';
PRODUCT_HOME_PREMIUM:
tmpStr := 'Home Premium Edition';
PRODUCT_HOME_PREMIUM_N:
tmpStr := 'Home Premium Edition';
PRODUCT_HOME_SERVER:
tmpStr := 'Home Server Edition';
PRODUCT_SERVER_FOR_SMALLBUSINESS:
tmpStr := 'Server for Small Business Edition';
PRODUCT_SMALLBUSINESS_SERVER:
tmpStr := 'Small Business Server';
PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
tmpStr := 'Small Business Server Premium Edition';
PRODUCT_STANDARD_SERVER:
tmpStr := 'Server Standard Edition (full installation)';
PRODUCT_STANDARD_SERVER_CORE:
tmpStr := 'Server Standard Edition (core installation)';
PRODUCT_STARTER:
tmpStr := 'Starter Edition';
PRODUCT_STORAGE_ENTERPRISE_SERVER:
tmpStr := 'Storage Server Enterprise Edition';
PRODUCT_STORAGE_EXPRESS_SERVER:
tmpStr := 'Storage Server Express Edition';
PRODUCT_STORAGE_STANDARD_SERVER:
tmpStr := 'Storage Server Standard Edition';
PRODUCT_STORAGE_WORKGROUP_SERVER:
tmpStr := 'Storage Server Workgroup Edition';
PRODUCT_UNDEFINED:
tmpStr := 'An unknown product';
PRODUCT_ULTIMATE:
tmpStr := 'Ultimate Edition';
PRODUCT_ULTIMATE_N:
tmpStr := 'Ultimate Edition';
PRODUCT_WEB_SERVER:
tmpStr := 'Web Server Edition';
PRODUCT_UNLICENSED:
tmpStr := 'Unlicensed product'
else
tmpStr := '';
end;{ pdwReturnedProductType }
Result := Result + tmpStr;
NTBRes := FALSE;
end;{ GetProductInfo<>NIL }
end;{ Vista }
if NTBres then
begin
if OSVI_NT.wProductType = VER_NT_WORKSTATION then
begin
if OSVI_NT.wProductType = VER_NT_WORKSTATION then
begin
case OSVI_NT.wSuiteMask of
512: Result := Result + 'Personal';
768: Result := Result + 'Home Premium';
else
Result := Result + 'Professional';
end;
end
else if OSVI_NT.wProductType = VER_NT_SERVER then
begin
if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then
Result := Result + 'DataCenter Server'
else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then
Result := Result + 'Advanced Server'
else
Result := Result + 'Server';
end;
end{ wProductType=VER_NT_WORKSTATION }
else
begin
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then
try
tmpStr := UpperCase(ReadString('ProductType'));
if tmpStr = 'WINNT' then
Result := Result + 'Workstation';
if tmpStr = 'SERVERNT' then
Result := Result + 'Server';
finally
CloseKey;
end;
finally
Free;
end;
end;{ wProductType<>VER_NT_WORKSTATION }
end;{ NTBRes }
end;{ VER_PLATFORM_WIN32_NT }
VER_PLATFORM_WIN32_WINDOWS:
begin
if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then
begin
Result := 'Windows 95 ';
if OSVI.szCSDVersion[1] = 'C' then
Result := Result + 'OSR2';
end;
if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then
begin
Result := 'Windows 98 ';
if OSVI.szCSDVersion[1] = 'A' then
Result := Result + 'SE';
end;
if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then
Result := 'Windows Me';
end;{ VER_PLATFORM_WIN32_WINDOWS }
VER_PLATFORM_WIN32s:
Result := 'Microsoft Win32s';
else
Result := 'Unknown';
end;{ OSVI_NT.dwPlatformId }
end;{ GetOSInfo }
procedure TMainForm.BitBtn01Click(Sender: TObject);
begin
//
end;
initialization
@GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'),
'GetProductInfo');
end.
你的问题是你没有从@Ken的答案中复制代码。我们没有必要去调试你犯的转录错误。正确的解决方案是正确使用答案中的代码。既然@Ken给了你一个完整的单位,就用它吧。确保使用剪贴板。选择整个单元并将其粘贴到空编辑器窗口中。然后将其保存到名为
GetWinVersionInfo.pas
的文件中
如果您需要编辑该代码,那么我可能会删除现在可以在Windows单元中找到的所有声明。只有这些东西的一个副本可以避免混淆。例如,我认为类型和常量都可以删除。在带有
\u OSVERSIONINFOEX
的行之前缺少type
关键字。我添加了“type”,但错误出现在“\u OSVERSIONINFOEX:record”行中,即“E2029”='expected':'found”和“szCSDVersion:array[0..127]的AnsiChar”;行为“E2029'='expected but':'found.”请帮帮我。啊,我明白了。你只是复制了一个错误。没关系,你不需要所有这些类型和常量,因为你已经在Winapi.Windows.pas
单元中定义了它们。换句话说,“我复制并粘贴了一堆代码,但没有真正理解它们的含义,当它没有编译时,我尝试了一些随机编辑,使我不想理解的错误消失;使用我编辑过的代码来猜测我的原始错误。“投票关闭太本地化了。我想你是在告诉我,像“TOSVersion”在“System.SysUtils”中翻译,“tosversioninfo”在“Winapi.Windows”中翻译“。如果是,如何实施。是的,这是正确的。你能告诉我们你想用这个代码做什么吗?我想让这个代码首先更具体地显示windows版本。其次,如果操作系统是Vista Ultimate或Seven Ultimate,则只会启用一些按钮,我的程序就会运行。我认为“TOSVersion”并没有指定Windows版本,只能使用“TosVersionInfo”来完成。我并不急于使用过时的代码。更新的代码总是很好。另一个问题是,在Windows 8环境中,“TOSVersion.Name”只返回“Windows”而不是“Windows 8”。