如何读取本机的硬件配置信息--大家帮帮忙吧!!!

xzlinux 2004-12-07 10:09:41
主要是读取本机的硬件信息,如:
显卡是什么型号的
硬盘是什么型号的
网卡是什么型号的
当然要是能读出PCI也可以(不过现在没什么必要),要好能读出主板的型号和CPU,内存的型号。
我在注册表里找过了,发现只要是该机用过的它都有记录(是用XP做的实验),我希望用什么方法只取得当前的硬件列表信息。
我初步估计是要读BIOS信息,可能还要读注册表什么的(其实我最开始就是想只从注册表读这些信息,后来发现太杂了。),最后可以还要调API什么的。(我的同学推荐我用WMI什么的)
...全文
1136 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Kshape 2005-02-06
回复 | 收藏此页 | 专题 | 公告 | 管理 | 保存 | 关闭窗口

----------------------
帖子右上边
点“管理”然后输入密码
给分
完毕

这是什么世道啊
回复
xzlinux 2005-02-06
谢谢大家的支持和帮助。
我不会结贴,有谁能指点一下,我实在没有什么时候来研究结贴的方法了,管理员要是看这贴不顺眼就删了它吧!
回复
xzlinux 2004-12-19
谢谢
Kevin_Lmx(繁华阅尽)的支持,
其实我只是学了一点Delphi,
最近听说CSDN上有很多牛人,所以来看看(主要是以前不经常上网,所以不会搜以前的贴)

我看了一下注册表中的一些硬件信息,里面的信息到是很全,就是不清楚如何辨别当前的硬件型号列表。
我想问一下,一般来说硬件的型号信息,是在什么地方保存?
是在硬件BIOS中还是在主板的BIOS中,或是用什么函数直接来读呢?
像有些测试软件里的硬件列表就很丰富(真想做真那种效果啊),要是能做到那一步,我就知足了啊 :)
回复
Kevin_Lmx 2004-12-17
主板相关:
function GetmotherboradKey: string; //取得主板序列号
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
result := GetRomBiosString(RBD, Ptr($FEC71));
end
else result := 'sadgf00net';
end;

function Getmotherboradver: string; //BIOS 版本
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
result := GetRomBiosString(RBD, Ptr($FE061));
end
else result := 'sadgf00net';
end;

function Getmotherboradverxx: string; //BIOS 版权信息
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
result := GetRomBiosString(RBD, Ptr($FE091));
end
else result := 'sadgf00net';
end;

function Getmotherboraddate: string; //BIOS日期
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
result := GetRomBiosString(RBD, Ptr($FFFF5));
end
else result := 'sadgf00net';
end;

function Getmotherboradname: string; //BIOS 名称
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
result := GetRomBiosString(RBD, Ptr($FE0C1));
end
else result := 'sadgf00net';
end;
回复
Kevin_Lmx 2004-12-17
得到显卡型号:
function GetDisplayDevice: string;
var
lpDisplayDevice: TDisplayDevice;
dwFlags: DWORD;
cc: DWORD;
begin
lpDisplayDevice.cb := sizeof(lpDisplayDevice);
dwFlags := 0;
cc:= 0;
while EnumDisplayDevices(nil, cc, lpDisplayDevice , dwFlags) do
begin
Inc(cc);
if (lpDisplayDevice.DeviceName='\\.\Display1') or (lpDisplayDevice.DeviceName='\\.\DISPLAY1') then
Result :=lpDisplayDevice.DeviceString;
end;
end;
回复
Kevin_Lmx 2004-12-17
那你比我厉害多了。
^_^
回复
xzlinux 2004-12-16
个位前辈,我早已经知道了如何读网卡的MAC地址,我现在最需要的是读取硬件的型号信息,注意不是序列号。
在此,我要忠心的感谢大家对我的支持和培养。
回复
Kevin_Lmx 2004-12-16
[转载]一点点补充的 ^_^

在程序中获得网卡的物理地址
摘自:中国大陆Borland程序员论坛
整理:Dolphin

每块LAN适配器都有与它们对应的一个唯一的6字节编号,这个编号包含在适配器的ROM中,保证每块适配器都能与其它的适配器区别开。这个编号有多个称呼:永久节点名、永久节点地址、硬地址、单元标识编号等。网卡的物理地址在出厂前就已由厂家分配,不可改变,因此可作为硬件识别的标识。通过NetBIOS编程可将此编号读出,以下是两函数相关函数:
function NBGetAdapterAddress : String ;
{
=========================================================================
Returns adapter card address.
=========================================================================
}
var

NCB : TNCB ; // Netbios control block //NetBios控制块
ADAPTER : TADAPTERSTATUS ; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM ; // Netbios lana
intIdx : Integer ; // Temporary work value//临时变量
cRC : Char ; // Netbios return code//NetBios返回值
strTemp : String ; // Temporary string//临时变量

begin
// Initialize
Result := '' ;

try
// Zero control blocl
ZeroMemory(@NCB,SizeOf(NCB)) ;

// Issue enum command
NCB.ncb_command := Chr(NCBENUM) ;
cRC := NetBios(@NCB) ;

// Reissue enum command
NCB.ncb_buffer := @LANAENUM ;
NCB.ncb_length := SizeOf(LANAENUM) ;
cRC := NetBios(@NCB) ;
if Ord(cRC) 0 then
exit ;

// Reset adapter
ZeroMemory(@NCB,SizeOf(NCB)) ;
NCB.ncb_command := Chr(NCBRESET) ;
NCB.ncb_lana_num := LANAENUM.lana[0] ;
cRC := NetBios(@NCB) ;
if Ord(cRC) 0 then
exit ;

// Get adapter address
ZeroMemory(@NCB,SizeOf(NCB)) ;
NCB.ncb_command := Chr(NCBASTAT) ;
NCB.ncb_lana_num := LANAENUM.lana[0] ;
StrPCopy(NCB.ncb_callname,'*') ;
NCB.ncb_buffer := @ADAPTER ;
NCB.ncb_length := SizeOf(ADAPTER) ;
cRC := NetBios(@NCB) ;

// Convert it to string
strTemp := '' ;
for intIdx := 0 to 5 do
strTemp := strTemp + HexBL(Byte(ADAPTER.adapter_address[intIdx])) ;
Result := strTemp ;
finally
end ;
end ;

function NBRCtoString(cRC:Char) : String ;
{

=========================================================================
Translates the NetBios return code character to it's equivalent long message.
=========================================================================
}
begin
case cRC of
Chr($00) : Result := 'good return' ;
Chr($01) : Result := 'illegal buffer length' ;
Chr($03) : Result := 'illegal command' ;
Chr($05) : Result := 'command timed out' ;
Chr($06) : Result := 'message incomplete, issue another command' ;
Chr($07) : Result := 'illegal buffer address' ;
Chr($08) : Result := 'session number out of range' ;
Chr($09) : Result := 'no resource available' ;
Chr($0a) : Result := 'session closed' ;
Chr($0b) : Result := 'command cancelled' ;
Chr($0d) : Result := 'duplicate name' ;
Chr($0e) : Result := 'name table full' ;
Chr($0f) : Result := 'no deletions, name has active sessions' ;
Chr($11) : Result := 'local session table full' ;
Chr($12) : Result := 'remote session table full' ;
Chr($13) : Result := 'illegal name number' ;
Chr($14) : Result := 'no callname' ;
Chr($15) : Result := 'cannot put * in NCB_NAME' ;
Chr($16) : Result := 'name in use on remote adapter' ;
Chr($17) : Result := 'name deleted' ;
Chr($18) : Result := 'session ended abnormally' ;
Chr($19) : Result := 'name conflict detected' ;
Chr($21) : Result := 'interface busy, IRET before retrying' ;
Chr($22) : Result := 'too many commands outstanding, retry later' ;
Chr($23) : Result := 'NCB_lana_num field invalid' ;
Chr($24) : Result := 'command completed while cancel occurring' ;
Chr($26) : Result := 'command not valid to cancel' ;
Chr($30) : Result := 'name defined by anther local process' ;
Chr($34) : Result := 'environment undefined. RESET required' ;
Chr($35) : Result := 'required OS resources exhausted' ;
Chr($36) : Result := 'max number of applications exceeded' ;
Chr($37) : Result := 'no saps available for netbios' ;
Chr($38) : Result := 'requested resources are not available' ;
Chr($39) : Result := 'invalid ncb address or length > segment' ;
Chr($3B) : Result := 'invalid NCB DDID' ;
Chr($3C) : Result := 'lock of user area failed' ;
Chr($3f) : Result := 'NETBIOS not loaded' ;
Chr($40) : Result := 'system error' ;
Chr($ff) : Result := 'asynchronous command is not yet finished' ;
else Result := 'unknown'
end ;
end ;
回复
Kevin_Lmx 2004-12-16
这个……搜搜以前的贴,有好多的……
回复
qmj2003 2004-12-16
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(…)部分。

4、获取Windows和系统路径
可以通过Windows API函数来获得
具体程序如下:
procedure TForm1.Button1Click(Sender: TObject);
Var
SysDir:array[0..128] of char;
begin
GetWindowsDirectory(SysDir,128);
Edit1.Text:='Windows 路径:'+SysDir;
GetSystemDirectory(SysDir,128);
Edit1.Text:=Edit1.Text+'; 系统路径:'+SysDir;
end;

end.
其中,笔者通过更改数列的值:发现其中的128可更改为人以不小于16的的数值,若小于或等于16均出现异常(笔者的操作系统为Windows2000)。读者朋友不妨试试。

5、获取用户注册信息
我们都知道,一般在软件安装过程中,它都会提示用户,要求输入系列号或产品号和用户的一些注册信息(用户的公司名称、用户名等)以及安装的目录和路径等。
通过以下代码可查看用户注册信息:
procedure TForm1.Button1Click(Sender: TObject);
Var
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion',False);
Edit1.Text:='当前路径:'+Reg.CurrentPath;
Edit2.Text:='产品系列号:'+Reg.ReadString('ProductId');
Edit3.Text:='产品名:'+Reg.ReadString('ProductName');
Edit4.Text:='注册公司名称:'+Reg.ReadString('RegisteredOrganization');
Edit5.Text:='用户名:'+Reg.ReadString('RegisteredOwner');
Edit6.Text:='软件类型:'+Reg.ReadString('SoftwareType');
Reg.CloseKey;
Reg.Free;
end;

end.
注意:在程序编译之前,必须在USES语句下添加registry单元。

6、关闭Widows
可以通过Windows API函数ExitWindowsEx来关闭Widows。
procedure TForm1.Button1Click(Sender: TObject);
begin
if RadioButton1.Checked=true then
ExitWindowsEx(EWX_LOGOFF,0) //以其他用户身份登录
else if RadioButton2.Checked=true then
ExitWindowsEx(EWX_SHUTDOWN,1) //安全关机
else if RadioButton3.Checked=true then
ExitWindowsEx(EWX_REBOOT,2) //重新启动计算机
else if RadioButton4.Checked=true then
ExitWindowsEx(EWX_FORCE,4) //强行关机
else if RadioButton5.Checked=true then
ExitWindowsEx(EWX_POWEROFF,8); //关闭系统并关闭电源

end;

end.
回复
xzlinux 2004-12-16
没有人知道吗?
看来高手都睡着了,真受不了啊。
回复
xzlinux 2004-12-16
没有人知道吗?
看来高手都睡着了,真受不了啊。
回复
xzlinux 2004-12-16
没有人知道吗?
看来高手都睡着了,真受不了啊。
回复
imacih 2004-12-08
这个帖子有一些你要的信息。
http://community.csdn.net/Expert/topic/3550/3550939.xml?temp=.4882776
回复
xzlinux 2004-12-08
怎么没人理我啊?:(
回复
xzlinux 2004-12-07
大家帮帮忙吧,谢谢了:)
回复
xzlinux 2004-12-07
大家帮帮忙吧,谢谢了:)
回复
相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1161

社区成员

Delphi Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2004-12-07 10:09
社区公告
暂无公告