如何delphi7获取xp、win7、vista系统下主板序列号??

分数先100如果问题回答的好 我在增加!
最好是在 各种系统下、各个厂家的主板都可以正确获得主板的序列号!
最好写成函数形式 !
其实就是 95 98 2000 2003 XP win7 vista 这些系统就行
如果 只能支持 XP 2000 2003 win7 vista 也行

不要求一次都把这些解决了 能解决其中一个系统也行啊!

如果你建议我安装一个其他软件就算了 因为我不可能让用户去查看自己的序列号

我要这个序列号是来标识客户唯一性的 这个步骤不希望 用户看到

如果你要是提议 在delphi中安装第三方控件或者用其他人的 pas文件或者dll文件 这样还行。

各位请看清楚 我想要的是 各个硬件 序列号 不是其他信息!

让大家费心了 , 我在这里先谢谢大家!

这个问题让我来回答你吧,因为我用delphi7做这个有八九年历史了,一直用硬件序列号进行加密注册,所以还是有发言权的。又因为不要你的分数,所以就懒得登陆了。不过,答案你也会有点点失望,因为我没能解决你的问题。
先说说主板吧,如果你是想做软件加密,这个你就死了心吧,因为主板的Bios没有统一格式,而且Bios版本不同,所用的存储格式也不尽相同,所以,你即使今天把获取市面上的所有主板序列号的函数都写好了,明天出新的主板,你的函数照样识别不了,获取主板序列号就失败了。
那么什么最稳定呢?答案是硬盘序列号。其他那些什么网卡MAC、CPU序列号等等等等,都是不行的。只有硬盘序列号最稳定,几乎百分百成功,而且在VISTA和Win7下面不需要管理员权限都可以获取到。但是,硬盘种类也不少,比如有IDE的,有SATA一代、二代的,有SCSI的,要针对每种硬盘写对应的函数,这个工作量也不小。正因为这样,这种函数大多被做成了dll,商业出售。换句话说,你想用得专业,就请购买。因为人家专门研究这个,肯定也是要吃饭的。天下没有免费午餐的,即使有,也是不容易消化的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-24
1、获取windows版本信息
可以通过Windows API函数GetVersionEx来获得。
具体程序如下:
Procedure Tform1.Button1Click(sender:TObject);
Var
OSVI:OSVERSIONINFO;
begin
OSVI.dwOSversioninfoSize:=Sizeof(OSVERSIONINFO);
GetVersionEx(OSVI);
label1.Caption:=IntToStr(OSVI.dwMinorVersion)+','
+IntToStr(OSVI.dwMinorVersion)+','
+IntToStr(OSVI.dwBuildNumber)+','
+IntToStr(OSVI.dwPlatformId)+','
+OSVI.szCSDVersion;
end;

end.

2、获取CPU信息
可以通过Windows API函数GetSystemInfo来获得有关信息。
具体程序如下:
procedure TForm1.Button1Click(Sender: TObject);
Var
SysInfo:SYSTEM_INFO;
begin
GetSystemInfo(Sysinfo);
Edit1.Text:='系统中有'+IntToStr(Sysinfo.dwNumberOfProcessors)+'个CPU'
+',类型为'+IntToStr(Sysinfo.dwProcessorType);
end;

end.

3、获取内存信息
可以通过Windows API函数GlobalMemoryStatus来获得内存信息。
具体程序如下:
procedure TForm1.Button1Click(Sender: TObject);
Var
MemInfo:MEMORYSTATUS;
begin
MemInfo.dwLength:=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(MemInfo);
memo1.Lines.Add(IntToStr(MemInfo.dwMemoryLoad)+'%的内存正在使用') ;
memo1.Lines.Add('物理内存共有'+IntToStr(MemInfo.dwTotalPhys)+'字节');
memo1.Lines.Add('可使用的物理内存有'+IntToStr(MemInfo.dwAvailPhys)+'字节');
memo1.Lines.Add('交换文件总大小为'+IntToStr(MemInfo.dwTotalPageFile)+'字节') ;
memo1.Lines.Add('尚可交换文件大小为'+IntToStr(MemInfo.dwAvailPageFile)+'字节');
memo1.Lines.Add('总虚拟内存有'+IntToStr(MemInfo.dwTotalVirtual)+'字节');
memo1.Lines.Add('未用虚拟内存有'+IntToStr(MemInfo.dwAvailVirtual)+'字节');
end;

end.

或用以下代码:
memo1.Text:=IntToStr(MemInfo.dwMemoryLoad)+'%的内存正在使用'+#13#10
+'可使用的物理内存有'+IntToStr(MemInfo.dwAvailPhys)+'字节'+#13#10
+'交换文件总大小为'+IntToStr(MemInfo.dwTotalPageFile)+'字节'+#13#10
+'尚可交换文件大小为'+IntToStr(MemInfo.dwAvailPageFile)+'字节'+#13#10
+'总虚拟内存有'+IntToStr(MemInfo.dwTotalVirtual)+'字节'+#13#10
+'未用虚拟内存有'+IntToStr(MemInfo.dwAvailVirtual)+'字节';
来替代memo1.line.add(…)部分。
第2个回答  2010-11-24
调用Windows的API。可以实现的。不过,只适合在Windows的系统。
其它的系统,不知道您是不是指Linux,DELPHI7只支持这两个系统中编译。
Linux系统不是很清楚,理论上,使用主板驱动提供的程序,是可以实现的,不过,只是针对主板要设计多个函数,多态的方式。
Linux下,我还没想到更好的办法。本回答被网友采纳
第3个回答  2010-11-24
下个 everest
他是查看硬件的软件,非常强大,点击主板,就能看到主板的序列号!
这个东西必须的借助软件!
下一非常容易,绿色的软件
也有安装的
相似回答