我想读取CPU的信息,用vc怎么做呀? rt 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用bcb写的,大致差不多,调用汇编!以前收集的资料://------CPUID Instruction Demo Program------------#include #include #pragma hdrstop//------------------------------------------------#pragma inline#pragma argsusedint main(int argc, char **argv){char OEMString[13];int iEAXValue,iEBXValue,iECXValue,iEDXValue;_asm {mov eax,0cpuidmov DWORD PTR OEMString,ebxmov DWORD PTR OEMString+4,edxmov DWORD PTR OEMString+8,ecxmov BYTE PTR OEMString+12,0}cout< < "This CPU 's OEM String is:"< < OEMString< < endl;_asm {mov eax,1cpuidmov iEAXValue,eaxmov iEBXValue,ebxmov iECXValue,ecxmov iEDXValue,edx}if(iEDXValue&0x800000)cout < < "This is MMX CPU"< < endl;elsecout < < "None MMX Support."< < endl;int iCPUFamily=(0xf00 & iEAXValue) > >8;cout < < "CPU Family is:"< < iCPUFamily< < endl;_asm{mov eax,2CPUID}if(_AL==1)cout < < "Pentium Pro or Pentium II Found";getch();return 0;} // test.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "tchar.h"#include "windows.h"int main(int argc, char* argv[]){ DWORD dwOldFlag, dwFlag; TCHAR m_szCPUName[1024]; TCHAR m_szOEMString[1024]; DWORD m_nFamily; DWORD m_nType,m_nModel; bool m_bFPU,m_bPSN,m_bMMX; DWORD m_dwSerialNumber[3]; _asm { pushfd //保存老的eflag mov edx, [esp] mov dwOldFlag, edx //修改eflag xor DWORD PTR [esp], 0x200000 popfd //得到新的eflag pushfd pop eax mov dwFlag, eax //恢复eflag push edx popfd } if(dwOldFlag == dwFlag) // 386 { lstrcpy(m_szOEMString, _T("80386")); lstrcpy(m_szCPUName, _T("80386")); m_nFamily=3; m_nType=0;//PROCESSOR_TYPE_OEM; m_nModel=0; } else { // OEM String ::ZeroMemory(m_szOEMString, sizeof(m_szOEMString)); DWORD dwTemp=(DWORD)m_szOEMString; DWORD dwTemp2, dwTemp3; _asm { XOR EAX, EAX CPUID MOV EDI, dwTemp MOV EAX, EBX shr eax, 16#ifdef UNICODE mov [EDI+0*2], bl mov [EDI+1*2], bh mov [EDI+2*2], al mov [EDI+3*2], ah#else mov [EDI+0], bl mov [EDI+1], bh mov [EDI+2], al mov [EDI+3], ah#endif MOV EAX, EDX shr eax, 16#ifdef UNICODE mov [EDI+4*2], dl mov [EDI+5*2], dh mov [EDI+6*2], al mov [EDI+7*2], ah#else mov [EDI+4], dl mov [EDI+5], dh mov [EDI+6], al mov [EDI+7], ah#endif MOV EAX, ECX shr eax, 16#ifdef UNICODE mov [EDI+8*2], cl mov [EDI+9*2], ch mov [EDI+10*2], al mov [EDI+11*2], ah#else mov [EDI+8], cl mov [EDI+9], ch mov [EDI+10], al mov [EDI+11], ah#endif } //CPU Type _asm { mov eax, 1 cpuid mov dwTemp, eax mov dwTemp2, edx }#pragma pack(push,1) typedef struct tagPROCESSORVERSIONINFO { unsigned long SteppingID : 4; unsigned long Model : 4; unsigned long Family : 4; unsigned long Type : 2; unsigned long Reserve1 : 2; unsigned long ExtendModel : 4; unsigned long ExtendFamily : 8; unsigned long Reserve2 : 4; }PROCESSORVERSIONINFO, FAR * LPPROCESSORVERSIONINFO;#pragma pack(pop) LPPROCESSORVERSIONINFO pinfo=(LPPROCESSORVERSIONINFO)&dwTemp; m_nFamily=pinfo->Family; m_nFamily+=pinfo->ExtendFamily * 16; m_nModel=pinfo->Model; m_nModel+=pinfo->ExtendModel * 16; m_nType=pinfo->Type; if((dwTemp2 & 1) ==1) m_bFPU=true; else m_bFPU=false; dwTemp2=dwTemp2>>18; if((dwTemp2 & 1) ==1) m_bPSN=true; else m_bPSN=false; dwTemp2=dwTemp2>>5; if((dwTemp2 & 1) ==1) m_bMMX=true; else m_bMMX=false; //取序列号 if(m_bPSN) { _asm { mov eax, 0x01 cpuid mov dwTemp3, eax mov eax, 0x03 cpuid mov dwTemp2, edx mov dwTemp, ecx } m_dwSerialNumber[2]=dwTemp3; m_dwSerialNumber[1]=dwTemp2; m_dwSerialNumber[0]=dwTemp; } //取cache和tlb信息 if(m_nFamily>5) { _asm { mov eax, 2 cpuid } } if(lstrcmp(m_szOEMString, _T("CyrixInstead"))==0) //Cyrix { if(m_nFamily==4) lstrcpy(m_szCPUName, _T("MediaGX")); else if(m_nFamily==5) { if(m_nModel==2) lstrcpy(m_szCPUName, _T("6x86")); else if(m_nModel==4) lstrcpy(m_szCPUName, _T("GXm")); else lstrcpy(m_szCPUName, _T("Unknown")); } else if(m_nFamily==6) lstrcpy(m_szCPUName, _T("6x86MX")); else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("NexGenDriven"))==0) // NexGen { if(m_nFamily==5) lstrcpy(m_szCPUName, _T("Nx586")); else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("UMC UMC UMC"))==0) // UMC { if(m_nFamily==4) { if(m_nModel==1) lstrcpy(m_szCPUName, _T("U5D")); else if(m_nModel==2) lstrcpy(m_szCPUName, _T("U5S")); else lstrcpy(m_szCPUName, _T("Unknown")); } else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("AuthenticAMD"))==0) // AMD { if(m_nFamily==4) { if(m_nModel==3) lstrcpy(m_szCPUName, _T("486DX2WT")); else if(m_nModel==7) lstrcpy(m_szCPUName, _T("486DX2WB")); else if(m_nModel==8) lstrcpy(m_szCPUName, _T("486DX4WT")); else if(m_nModel==9) lstrcpy(m_szCPUName, _T("486DX4WB")); else if(m_nModel==0x0e) lstrcpy(m_szCPUName, _T("5x86WT")); else if(m_nModel==0x0f) lstrcpy(m_szCPUName, _T("5x86WB")); else lstrcpy(m_szCPUName, _T("486")); } else if(m_nFamily==5) { if(m_nModel==0) lstrcpy(m_szCPUName, _T("K5/SS")); else if(m_nModel==1 || m_nModel==2 || m_nModel==3) lstrcpy(m_szCPUName, _T("K5")); else if(m_nModel==6 || m_nModel==7) lstrcpy(m_szCPUName, _T("K6")); else if(m_nModel==8) lstrcpy(m_szCPUName, _T("K6-2")); else if(m_nModel==9) lstrcpy(m_szCPUName, _T("K6-III")); else lstrcpy(m_szCPUName, _T("K5/K6")); } else if(m_nFamily==6) { if(m_nModel==0) lstrcpy(m_szCPUName, _T("K7 stylebook")); else lstrcpy(m_szCPUName, _T("K7")); } else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("CentaurHauls"))==0) // IDT { if(m_nFamily==5) { if(m_nModel==4) lstrcpy(m_szCPUName, _T("WinChip C6")); else if(m_nModel==8) lstrcpy(m_szCPUName, _T("WinChip 2")); else lstrcpy(m_szCPUName, _T("Unknown")); } else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("RiseRiseRise"))==0) // Rise { if(m_nFamily==5) { if(m_nModel==0) lstrcpy(m_szCPUName, _T("mP6")); else lstrcpy(m_szCPUName, _T("Unknown")); } else lstrcpy(m_szCPUName, _T("Unknown")); } else if(lstrcmp(m_szOEMString, _T("GenuineIntel"))==0) // Intel { if(m_nFamily==4) { if(m_nModel==0 || m_nModel==1) lstrcpy(m_szCPUName, _T("486DX")); else if(m_nModel==2) lstrcpy(m_szCPUName, _T("486SX")); else if(m_nModel==3) lstrcpy(m_szCPUName, _T("486DX2")); else if(m_nModel==4) lstrcpy(m_szCPUName, _T("486SL")); else if(m_nModel==5) lstrcpy(m_szCPUName, _T("486SX2")); else if(m_nModel==7) lstrcpy(m_szCPUName, _T("486DX2_WB")); else if(m_nModel==8) lstrcpy(m_szCPUName, _T("486DX4")); else lstrcpy(m_szCPUName, _T("486")); } else if(m_nFamily==5) { if(m_nModel==1) lstrcpy(m_szCPUName, _T("PentiumP5")); else if(m_nModel==2) lstrcpy(m_szCPUName, _T("PentiumP54C")); else if(m_nModel==3) lstrcpy(m_szCPUName, _T("Pentiumi486")); else if(m_nModel==4) lstrcpy(m_szCPUName, _T("PentiumMMX")); else if(m_nModel==5) lstrcpy(m_szCPUName, _T("PentiumDX4")); else if(m_nModel==6) lstrcpy(m_szCPUName, _T("Pentium OverDrive P5")); else lstrcpy(m_szCPUName, _T("Pentium")); } else if(m_nFamily==6) { if(m_nModel==1) lstrcpy(m_szCPUName, _T("PentiumPro OverDrive P6")); else if(m_nModel==3) lstrcpy(m_szCPUName, _T("Pentiumi II")); else if(m_nModel==5) lstrcpy(m_szCPUName, _T("Celeron")); else if(m_nModel==6) lstrcpy(m_szCPUName, _T("CeleronA")); else if(m_nModel==7) lstrcpy(m_szCPUName, _T("PentiumIII")); else lstrcpy(m_szCPUName, _T("PentiumPro")); } else if(m_nFamily==7) { lstrcpy(m_szCPUName, _T("Pentium 4")); } else lstrcpy(m_szCPUName, _T("Unknown")); } } return 0;} 不知道你想得到哪些信息?有三种途径:1.直接内嵌汇编代码,使用CPUID指令2.访问注册表:\\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor3.使用WMI方法,这种方法最复杂,但内容最全,关于使用,你可以在MSDN中查阅 同意使用WMI方法,这是Windows 系统管理的标准。 TCP客户端程序编写步骤: 缓冲运动问题[VC有没有好像FLASH里的TweenMax的类?] CWebBrowser2 控件使用问题 超级难题! 请教如何动态生成按钮响应函数的消息映射? 请教关于CreateProcess! 求助:PS/2键盘端口的读写问题 在哪里注册国际域名比较好啊? 紧急求救! VC 6.0 使用PRO*c链结问题!!! 如何获得本机或者本机某端口的网络流量? 无模式对话框不用mfc如何创建? 严重问题!!!200分相送!!!COleDropTarget::Register问题
以前收集的资料:
//------CPUID Instruction Demo Program------------
#include
#include
#pragma hdrstop
//------------------------------------------------
#pragma inline
#pragma argsused
int main(int argc, char **argv)
{
char OEMString[13];int iEAXValue,iEBXValue,iECXValue,iEDXValue;
_asm {
mov eax,0
cpuid
mov DWORD PTR OEMString,ebx
mov DWORD PTR OEMString+4,edx
mov DWORD PTR OEMString+8,ecx
mov BYTE PTR OEMString+12,0
}cout< < "This CPU 's OEM String is:"< < OEMString< < endl;_asm {
mov eax,1
cpuid
mov iEAXValue,eax
mov iEBXValue,ebx
mov iECXValue,ecx
mov iEDXValue,edx
}if(iEDXValue&0x800000)
cout < < "This is MMX CPU"< < endl;
else
cout < < "None MMX Support."< < endl;int iCPUFamily=(0xf00 & iEAXValue) > >8;
cout < < "CPU Family is:"< < iCPUFamily< < endl;_asm{
mov eax,2
CPUID
}
if(_AL==1)
cout < < "Pentium Pro or Pentium II Found";getch();
return 0;
}
//#include "stdafx.h"
#include "tchar.h"
#include "windows.h"int main(int argc, char* argv[])
{
DWORD dwOldFlag, dwFlag;
TCHAR m_szCPUName[1024];
TCHAR m_szOEMString[1024];
DWORD m_nFamily;
DWORD m_nType,m_nModel;
bool m_bFPU,m_bPSN,m_bMMX;
DWORD m_dwSerialNumber[3];
_asm
{
pushfd
//保存老的eflag
mov edx, [esp]
mov dwOldFlag, edx
//修改eflag
xor DWORD PTR [esp], 0x200000
popfd
//得到新的eflag
pushfd
pop eax
mov dwFlag, eax
//恢复eflag
push edx
popfd
}
if(dwOldFlag == dwFlag) // 386
{
lstrcpy(m_szOEMString, _T("80386"));
lstrcpy(m_szCPUName, _T("80386"));
m_nFamily=3;
m_nType=0;//PROCESSOR_TYPE_OEM;
m_nModel=0;
}
else
{
// OEM String
::ZeroMemory(m_szOEMString, sizeof(m_szOEMString));
DWORD dwTemp=(DWORD)m_szOEMString;
DWORD dwTemp2, dwTemp3;
_asm
{
XOR EAX, EAX
CPUID
MOV EDI, dwTemp
MOV EAX, EBX
shr eax, 16
#ifdef UNICODE
mov [EDI+0*2], bl
mov [EDI+1*2], bh
mov [EDI+2*2], al
mov [EDI+3*2], ah
#else
mov [EDI+0], bl
mov [EDI+1], bh
mov [EDI+2], al
mov [EDI+3], ah
#endif
MOV EAX, EDX
shr eax, 16
#ifdef UNICODE
mov [EDI+4*2], dl
mov [EDI+5*2], dh
mov [EDI+6*2], al
mov [EDI+7*2], ah
#else
mov [EDI+4], dl
mov [EDI+5], dh
mov [EDI+6], al
mov [EDI+7], ah
#endif
MOV EAX, ECX
shr eax, 16
#ifdef UNICODE
mov [EDI+8*2], cl
mov [EDI+9*2], ch
mov [EDI+10*2], al
mov [EDI+11*2], ah
#else
mov [EDI+8], cl
mov [EDI+9], ch
mov [EDI+10], al
mov [EDI+11], ah
#endif
}
//CPU Type
_asm
{
mov eax, 1
cpuid
mov dwTemp, eax
mov dwTemp2, edx
}
#pragma pack(push,1)
typedef struct tagPROCESSORVERSIONINFO
{
unsigned long SteppingID : 4;
unsigned long Model : 4;
unsigned long Family : 4;
unsigned long Type : 2;
unsigned long Reserve1 : 2;
unsigned long ExtendModel : 4;
unsigned long ExtendFamily : 8;
unsigned long Reserve2 : 4;
}PROCESSORVERSIONINFO, FAR * LPPROCESSORVERSIONINFO;
#pragma pack(pop)
LPPROCESSORVERSIONINFO pinfo=(LPPROCESSORVERSIONINFO)&dwTemp;
m_nFamily=pinfo->Family;
m_nFamily+=pinfo->ExtendFamily * 16;
m_nModel=pinfo->Model;
m_nModel+=pinfo->ExtendModel * 16;
m_nType=pinfo->Type;
if((dwTemp2 & 1) ==1)
m_bFPU=true;
else
m_bFPU=false;
dwTemp2=dwTemp2>>18;
if((dwTemp2 & 1) ==1)
m_bPSN=true;
else
m_bPSN=false;
dwTemp2=dwTemp2>>5;
if((dwTemp2 & 1) ==1)
m_bMMX=true;
else
m_bMMX=false;
//取序列号
if(m_bPSN)
{
_asm
{
mov eax, 0x01
cpuid
mov dwTemp3, eax
mov eax, 0x03
cpuid
mov dwTemp2, edx
mov dwTemp, ecx
}
m_dwSerialNumber[2]=dwTemp3;
m_dwSerialNumber[1]=dwTemp2;
m_dwSerialNumber[0]=dwTemp;
}
//取cache和tlb信息
if(m_nFamily>5)
{
_asm
{
mov eax, 2
cpuid
}
}
if(lstrcmp(m_szOEMString, _T("CyrixInstead"))==0) //Cyrix
{
if(m_nFamily==4)
lstrcpy(m_szCPUName, _T("MediaGX"));
else if(m_nFamily==5)
{
if(m_nModel==2)
lstrcpy(m_szCPUName, _T("6x86"));
else if(m_nModel==4)
lstrcpy(m_szCPUName, _T("GXm"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(m_nFamily==6)
lstrcpy(m_szCPUName, _T("6x86MX"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("NexGenDriven"))==0) // NexGen
{
if(m_nFamily==5)
lstrcpy(m_szCPUName, _T("Nx586"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("UMC UMC UMC"))==0) // UMC
{
if(m_nFamily==4)
{
if(m_nModel==1)
lstrcpy(m_szCPUName, _T("U5D"));
else if(m_nModel==2)
lstrcpy(m_szCPUName, _T("U5S"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("AuthenticAMD"))==0) // AMD
{
if(m_nFamily==4)
{
if(m_nModel==3)
lstrcpy(m_szCPUName, _T("486DX2WT"));
else if(m_nModel==7)
lstrcpy(m_szCPUName, _T("486DX2WB"));
else if(m_nModel==8)
lstrcpy(m_szCPUName, _T("486DX4WT"));
else if(m_nModel==9)
lstrcpy(m_szCPUName, _T("486DX4WB"));
else if(m_nModel==0x0e)
lstrcpy(m_szCPUName, _T("5x86WT"));
else if(m_nModel==0x0f)
lstrcpy(m_szCPUName, _T("5x86WB"));
else
lstrcpy(m_szCPUName, _T("486"));
}
else if(m_nFamily==5)
{
if(m_nModel==0)
lstrcpy(m_szCPUName, _T("K5/SS"));
else if(m_nModel==1 || m_nModel==2 || m_nModel==3)
lstrcpy(m_szCPUName, _T("K5"));
else if(m_nModel==6 || m_nModel==7)
lstrcpy(m_szCPUName, _T("K6"));
else if(m_nModel==8)
lstrcpy(m_szCPUName, _T("K6-2"));
else if(m_nModel==9)
lstrcpy(m_szCPUName, _T("K6-III"));
else
lstrcpy(m_szCPUName, _T("K5/K6"));
}
else if(m_nFamily==6)
{
if(m_nModel==0)
lstrcpy(m_szCPUName, _T("K7 stylebook"));
else
lstrcpy(m_szCPUName, _T("K7"));
}
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("CentaurHauls"))==0) // IDT
{
if(m_nFamily==5)
{
if(m_nModel==4)
lstrcpy(m_szCPUName, _T("WinChip C6"));
else if(m_nModel==8)
lstrcpy(m_szCPUName, _T("WinChip 2"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("RiseRiseRise"))==0) // Rise
{
if(m_nFamily==5)
{
if(m_nModel==0)
lstrcpy(m_szCPUName, _T("mP6"));
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
else if(lstrcmp(m_szOEMString, _T("GenuineIntel"))==0) // Intel
{
if(m_nFamily==4)
{
if(m_nModel==0 || m_nModel==1)
lstrcpy(m_szCPUName, _T("486DX"));
else if(m_nModel==2)
lstrcpy(m_szCPUName, _T("486SX"));
else if(m_nModel==3)
lstrcpy(m_szCPUName, _T("486DX2"));
else if(m_nModel==4)
lstrcpy(m_szCPUName, _T("486SL"));
else if(m_nModel==5)
lstrcpy(m_szCPUName, _T("486SX2"));
else if(m_nModel==7)
lstrcpy(m_szCPUName, _T("486DX2_WB"));
else if(m_nModel==8)
lstrcpy(m_szCPUName, _T("486DX4"));
else
lstrcpy(m_szCPUName, _T("486"));
}
else if(m_nFamily==5)
{
if(m_nModel==1)
lstrcpy(m_szCPUName, _T("PentiumP5"));
else if(m_nModel==2)
lstrcpy(m_szCPUName, _T("PentiumP54C"));
else if(m_nModel==3)
lstrcpy(m_szCPUName, _T("Pentiumi486"));
else if(m_nModel==4)
lstrcpy(m_szCPUName, _T("PentiumMMX"));
else if(m_nModel==5)
lstrcpy(m_szCPUName, _T("PentiumDX4"));
else if(m_nModel==6)
lstrcpy(m_szCPUName, _T("Pentium OverDrive P5"));
else
lstrcpy(m_szCPUName, _T("Pentium"));
}
else if(m_nFamily==6)
{
if(m_nModel==1)
lstrcpy(m_szCPUName, _T("PentiumPro OverDrive P6"));
else if(m_nModel==3)
lstrcpy(m_szCPUName, _T("Pentiumi II"));
else if(m_nModel==5)
lstrcpy(m_szCPUName, _T("Celeron"));
else if(m_nModel==6)
lstrcpy(m_szCPUName, _T("CeleronA"));
else if(m_nModel==7)
lstrcpy(m_szCPUName, _T("PentiumIII"));
else
lstrcpy(m_szCPUName, _T("PentiumPro"));
}
else if(m_nFamily==7)
{
lstrcpy(m_szCPUName, _T("Pentium 4"));
}
else
lstrcpy(m_szCPUName, _T("Unknown"));
}
}
return 0;
}
1.直接内嵌汇编代码,使用CPUID指令
2.访问注册表:\\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor
3.使用WMI方法,这种方法最复杂,但内容最全,关于使用,你可以在MSDN中查阅