最近写控件,因为想加入版本信息,而通常大多数情况下,几乎所有的公司或个人都会在自己软件的版本信息里提及windows与内存信息。
参考msdn的范例,我把它写成个函数了。由于delphi6不提供osversioninfoex结构(我没用过delphi7,8,2005等,不知道是否开始提供这个结构了),所以只好自己定义一个。为了不会受到有的版本里已经提供这个结构的影响,也不影响别的什么地方,直接把它定义到函数内部了。
函数:(2000,xp下测试通过,有其它版本的兄弟可以测试一下,有问题,发消息给我)
function getversioninfo(var sproduct, sversion, sservicepack :string):bool;
type
_osversioninfoexa = 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;
_osversioninfoexw = record
dwosversioninfosize: dword;
dwmajorversion: dword;
dwminorversion: dword;
dwbuildnumber: dword;
dwplatformid: dword;
szcsdversion: array[0..127] of widechar;
wservicepackmajor: word;
wservicepackminor: word;
wsuitemask: word;
wproducttype: byte;
wreserved: byte;
end;
{ this record only support windows 4.0 sp6 and latter , windows 2000 ,xp, 2003 }
osversioninfoexa = _osversioninfoexa;
osversioninfoexw = _osversioninfoexw;
osversioninfoex = osversioninfoexa;
const
ver_platform_win32_ce = 3;
{ wproducttype defines }
ver_nt_workstation = 1;
ver_nt_domain_controller = 2;
ver_nt_server = 3;
{ wsuitemask defines }
ver_suite_smallbusiness = $0001;
ver_suite_enterprise = $0002;
ver_suite_backoffice = $0004;
ver_suite_terminal = $0010;
ver_suite_smallbusiness_restricted = $0020;
ver_suite_datacenter = $0080;
ver_suite_personal = $0200;
ver_suite_blade = $0400;
ver_suite_security_appliance = $1000;
var
info: osversioninfoex;
bex: bool;
begin
result := false;
fillchar(info, sizeof(osversioninfoex), 0);
info.dwosversioninfosize := sizeof(osversioninfoex);
bex := getversionex(posversioninfo(@info)^);
if not bex then
begin
info.dwosversioninfosize := sizeof(osversioninfo);
if not getversionex(posversioninfo(@info)^) then exit;
end;
with info do
begin
sversion := inttostr(dwmajorversion) + '.' + inttostr(dwminorversion)
+ '.' + inttostr(dwbuildnumber and $0000ffff);
sproduct := 'microsoft windows unknown';
case info.dwplatformid of
ver_platform_win32s: { windows 3.1 and earliest }
sproduct := 'microsoft win32s';
ver_platform_win32_windows:
case dwmajorversion of
4: { windows95,98,me }
case dwminorversion of
0:
if szcsdversion[1] in ['b', 'c'] then
begin
&