如何获取系统的型号以及制造商

xiaolinnet1377 2012-09-22 02:08:12
"计算机-属性"页面中的系统一栏,里面的制造商和型号如何获取?用什么API,或者在注册表的哪个位置,我找了好久也没找到.如果哪位大神知道请指点呀!谢谢了
...全文
329 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
苹果皮 2012-09-22
  • 打赏
  • 举报
回复
WMI
Gloveing 2012-09-22
  • 打赏
  • 举报
回复
//=====================================================================================
/* CPUID指令是intel IA32架构下获得CPU信息的汇编指令,
可以得到CPU类型,型号,制造商信息,商标信息,序列号,
缓存等一系列CPU相关的东西。
*/
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;


//用来存储eax,ebx,ecx,edx四个寄存器的信息
DWORD deax;
DWORD debx;
DWORD decx;
DWORD dedx;

void ExeCPUID(DWORD veax) //初始化CPU
{
__asm
{
mov eax,veax
cpuid
mov deax,eax
mov debx,ebx
mov decx,ecx
mov dedx,edx
}
}

/* 在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,
它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。
由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。
这个精确性是上述两种方法所无法比拟的。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)
来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中
*/
long GetCPUFreq() //获取CPU频率,单位: MHZ
{
int start,over;
_asm
{
RDTSC
mov start,eax
}
Sleep(50);
_asm
{
RDTSC
mov over,eax
}
return (over-start)/50000;
}



/* 把eax = 0作为输入参数,可以得到CPU的制造商信息。
cpuid指令执行以后,会返回一个12字符的制造商信息,
前四个字符的ASC码按低位到高位放在ebx,中间四个放在edx,最后四个字符放在ecx。
*/
string GetManID() //获取制造商信息
{
char ID[25];
memset(ID,0,sizeof(ID));

ExeCPUID(0); //初始化
memcpy(ID+0,&debx,4); //制造商信息复制到数组
memcpy(ID+4,&dedx,4);
memcpy(ID+8,&decx,4);

return string(ID);
}


/* 在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息,
这就是CPU的商标字符串。CPU的商标字符串也是通过cpuid得到的。
由于商标的字符串很长(48个字符),所以不能在一次cpuid指令执行时全部得到,
所以intel把它分成了3个操作,eax的输入参数分别是0x80000002,0x80000003,0x80000004,
每次返回的16个字符,按照从低位到高位的顺序依次放在eax, ebx, ecx, edx。
因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次cpuid。
*/
string GetCPUType()
{
const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束
char CPUType[49];//用来存储CPU型号信息
memset(CPUType,0,sizeof(CPUType));//初始化数组

for(DWORD t = 0 ; t < 3 ; t++ )
{
ExeCPUID(id+t);
//每次循环结束,保存信息到数组
memcpy(CPUType+16*t+ 0,&deax,4);
memcpy(CPUType+16*t+ 4,&debx,4);
memcpy(CPUType+16*t+ 8,&decx,4);
memcpy(CPUType+16*t+12,&dedx,4);
}

return string(CPUType);
}

void main()
{
cout<<"本机CPU信息如下:"<<endl;
cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;
cout<<"CPU 制造商: "<<GetManID()<<endl;
cout<<"CPU 型 号: "<<GetCPUType()<<endl;
cin.get();

}
冷月清晖 2012-09-22
  • 打赏
  • 举报
回复
参考http://topic.csdn.net/t/20041009/13/3437016.html


函数定义:
CString DetectCPUType();
CString DetectMemoryType();
变量:
// CPU type
CString m_sCPUNameString;
CString m_sCPUIdentifier;
CString m_sCPUVendorIdentifier;
DWORD m_dwCPUSpeed;

// total physical memory in MB
DWORD m_TotMem;
// total virtual memory
DWORD m_TotVirtMem;

函数:
CString CSystemLocalInfo::DetectCPUType()
{
LONG lresult;
HKEY NewKey;

lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T(CPU_CONFIGURATION_KEY),
0,KEY_EXECUTE,&NewKey);

if (ERROR_SUCCESS != lresult) return 0; // key not found

TCHAR szKeyValue[100]; memset(szKeyValue,0,100);
DWORD dwType=REG_SZ; DWORD dwSize=100;

lresult=RegQueryValueEx(NewKey,_T( "Identifier "),NULL,
&dwType,(LPBYTE)szKeyValue,&dwSize);

if ((lresult==ERROR_SUCCESS) && (dwSize> 0))
{ m_sCPUIdentifier=szKeyValue; };

memset(szKeyValue,0,100); dwType=REG_SZ; dwSize=100;

lresult=RegQueryValueEx(NewKey,_T( "VendorIdentifier "),NULL,
&dwType,(LPBYTE)szKeyValue,&dwSize);

if ((lresult==ERROR_SUCCESS) && (dwSize> 0))
{ m_sCPUVendorIdentifier=szKeyValue; };

memset(szKeyValue,0,100); dwType=REG_SZ; dwSize=100;

lresult=RegQueryValueEx(NewKey,_T( "ProcessorNameString "),
NULL,&dwType,(LPBYTE)szKeyValue,&dwSize);

if ((lresult==ERROR_SUCCESS) && (dwSize> 0))
{ m_sCPUNameString=szKeyValue; };

DWORD dwData=0; dwType=REG_DWORD; dwSize=sizeof(dwData);
lresult=RegQueryValueEx(NewKey,_T( "~MHz "),NULL,
&dwType,(LPBYTE)(&dwData),&dwSize);

if ((lresult==ERROR_SUCCESS) && (dwSize> 0))
{ m_dwCPUSpeed=dwData; };

RegCloseKey(NewKey);
return szKeyValue;
}

CString CSystemLocalInfo::DetectMemoryType()
{
// TODO: Add extra initialization here
MEMORYSTATUS Mem;
// get the memory status
GlobalMemoryStatus(&Mem);
// set the total memory
this-> m_TotMem=(DWORD)Mem.dwTotalPhys/(1024*1024);
this-> m_TotVirtMem=(DWORD)Mem.dwTotalVirtual/(1024*1024);

CString Msg;
Msg.Format( "物理内存: %ld MB : 虚拟内存: %ld MB ",
this-> m_TotMem,this-> m_TotVirtMem);
return Msg;
}
phison-UP10量产工具v1.78.00(U盘量产工具),亲测成功!!!设备名称: [I:]USB Mass Storage Device(Kingston DataTraveler 2.0 USB Device) PNP设备ID: VID = 0951 PID = 1607 设备序列号: 5B780FA602D0  设备版本: PMAP  设备类型: 标准USB设备 - USB2.0高速 芯片制造商: skymedi(擎泰)  芯片型号: SK6281/PS2232(版本号PMAP) 产品制造商: Kingston(金士顿)  产品型号: DataTraveler 2.0    U盘:金士顿2G 型号DMFP/2GB 量产工具:phison-UP10量产工具v1.78.00 方法: 1、将下载的phison-UP10量产工具v1.78.00解压到任一目录。 2、运行F1_B4_v178.exe或F2_v178.exe点击“取得信息”,如果从“测试报告”窗口有内容说明可以使用此工具量产你的U盘;如果弹出“没有找到设备”信息你只好另找了。 3、退出程序 4、运行ParamEdt.exe,配置--模式栏输入“21”,再选择“select”可选光盘ISO或BIN文件。然后按另存为一个1.ini文件。注意F1对应F1_B4_v178.exe;F2对应F2_v178.exe。(或者可直接配置好ini附后(1.ini),在文件中直接改ISO文件存放目录也可。) 1.ini文件 [Extra] Mode=21 [Misc] CDROM Image=D:\系统\萝卜家园 Ghost XP SP3 电脑城装机版 8.8.iso (←改成ISO文件存放目录) 5、再运行F1_B4_v178.exe或F2_v178.exe点击“开始”。稍等一会……下面变成绿色的框就成功了。再点“弹出”,重新插入U盘。 6、此量产工具模式可选择很多,有一些并不适用自己的U盘,其它参数你也需要多试一试才能成功。 在BIOS中启动设置为USB-CDROM 恢复时选择PE模式 还原 用原来的量产工具,选择模式3,重新量产一次。 注意:镜像文件选择留空就行了。 再用F1_B4_v178.exe,ini文件选param,方法同上。(不能i还原的,可进行低格)

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧