50分,如何分出我装的XP是professional或是home版 (50分)

  • 主题发起人 主题发起人 lfpsoft
  • 开始时间 开始时间
L

lfpsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道使用GetVersionEx可以得到系统的信息。
但是如果我想得到像以下图片的信息,该如何做呢?
例如如果我使用的是Win98,它有98 的se版之分,如果是XP的话,
它又有professional 和 home版之分。如果我的XP装了Service pack 1的话,
又可以显示出来。
总之我想得到的就像以下图片的信息。
2.jpg
 
转抄的,或许可以实现你的要求;
unit about;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, jpeg, XPMenu;

type
Tab = class(TForm)
Button1: TButton;
Bevel2: TBevel;
Bevel1: TBevel;
Panel1: TPanel;
Image1: TImage;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label7: TLabel;
LBLOS: TLabel;
lblMemory: TLabel;
XPMenu1: TXPMenu;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
// s:string;
procedure GetOSInfo; //系统信息程序
Procedure GetMemoryInfo ; //可用资源程序
public
{ Public declarations }
end;

var
ab: Tab;

implementation

{$R *.DFM}

procedure Tab.Button1Click(Sender: TObject);
begin
ab.Close;
end;

Procedure Tab.GetMemoryInfo ;//可用资源
var
MS: TMemoryStatus;
begin
MS.dwLength:=SizeOf(TMemoryStatus);
GlobalMemoryStatus(MS);
lblMemory.Caption:=lblMemory.Caption +FormatFloat('#,###" KB "',MS.dwTotalPhys div 1024);
end;

procedure Tab.GetOSInfo; //获取系统信息
var
Platform: string;
BuildNumber: Integer;
begin
case Win32Platform of
VER_PLATFORM_WIN32_WINDOWS:
begin
Platform := 'Microsoft Windows 95 ';
BuildNumber := Win32BuildNumber and $0000FFFF;
end;
VER_PLATFORM_WIN32_NT:
begin
Platform := 'Microsoft Windows NT';
BuildNumber := Win32BuildNumber;
if Win32MajorVersion=5.0 then
Platform := 'Microsoft Windows 2000 ';
end;
else
begin
Platform := 'Microsoft Windows ';
BuildNumber := 0;
end;
end;

if(Win32Platform = VER_PLATFORM_WIN32_WINDOWS)
or(Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
if Win32CSDVersion = ''
then lblOS.Caption := lblOS.Caption+Format('%s%s %d.%d (Build %d)',[Platform,#13,Win32MajorVersion,Win32MinorVersion,BuildNumber])
else lblOS.Caption := lblOS.Caption+Format('%s%s %d.%d (Build %d: %s)',[Platform+' ',#13,Win32MajorVersion,Win32MinorVersion, BuildNumber,Win32CSDVersion]);
end else lblOS.Caption := lblOS.Caption+Format('%s%s %d.%d', [Platform+' ',#13,Win32MajorVersion,Win32MinorVersion])
end;


procedure Tab.FormCreate(Sender: TObject);
begin
try
Caption:='关于 '+application.Title;
//ProgramIcon.Picture.icon:=Application.Icon;
// ProductName.Caption:=ProductName.Caption+Application.Title;
//version.Caption:=version.Caption+ver;
//Copyright.Caption:=Copyright.Caption+'茂一电子股份有限公司';
//Author.Caption:=Author.Caption+'茂一资讯组 郭宇城';
// Others.Caption:='程序运行于Win98~Win2000,ACCESS 2000支持!';
//初始化---------------------------
GetMemoryInfo;
GetOsinfo;
{***********************}
//初始化变量s...
// s:='';
except
MessageBox(handle,'某些信息不能取得','提示',MB_OK);
end;
end;
 
楼上的还是不能分出哪个是professional版 和 home版
 
我也顶一下!!!

希望andy_gou,能更加完善这段代码!@
 
为什么不去注册表找???很容易!!!
 
这些信息都在注册表里。
 
注册表内应该有信息,如果没有明确的信息,也可以从别的方面体现出来
如WIN98信息就在HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion下,Version 为Windows 98
至于说是否为‘SE’版,VersionNumber键值为4.10.2222的既是。
XP的我没仔细看过,不过应该类似。提取信息后,在程序里判断一下即可
 
如何分出我装的XP是professional或是home版
 
我找过了,好像没有发现
 
如果你要用 API 读,从网上找找,应该可以找到,谁让你出这点分呢,只有自己动手了。
如果你只要有这个效果,查 .../Windows NT/CurrentVersion/DigitalProductId 键值
自己去读出来,第一字节是数据总长度。
 
TTO 小雨哥
那个键值是个二进制数据来的。
再加200分,我另开一贴,不过我要的功能不单实现分别XP是professional或是home版
而且程序如果是在98或ME,或2000里运行,都能得到相应的信息,装了SP1也要显示出来。
可以的话,给个DEMO,可行立即给分。200不够还可以再商量。
 
HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion
试一下嘛!
 
HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion
这里没有明显的地professional或是home版的信息,可能真的在DigitalProductId里。
但是谁知道这个结构呢?
 
判断程序?!
 
但是DELPHI的TOSVERSIONINFO却还没有更新
 
TO:lfpsoft
:-) 挣分辛苦啊。
 
那些常量的值可以在Vs.net里查到。
但是我试了下,DELPHI不支持
var
vi:TOSVersionInfoEx
GetVersionEx(vi);

 
因为是系统信息,完全可能在各种系统里运行,两个结构必须在判断的前提下初始化,
如果你要我的 Delphi 测试代码,给我邮箱发信,或写在下面。
 
后退
顶部