您的位置:首页 > 其它

【2012年终总结】之四 获得CPU信息,剪贴板

2013-02-06 14:35 260 查看
//getCPUNumber.cpp

//用来存储信息
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
}
}

long GetCPUFreq()//获取CPU频率,单位: MHZ
{
int start1,start2;
_asm rdtsc
_asm mov start1,eax
Sleep(50);
_asm rdtsc
_asm mov start2,eax
return (start2-start1)/50000;
}

string GetManID()//获取制造商信息
{
char ID[25];//存储制造商信息
memset(ID,0,sizeof(ID));//先清空数组 ID
ExeCPUID(0);//初始化
memcpy(ID+0,&debx,4);//制造商信息前四个字符复制到数组
memcpy(ID+4,&dedx,4);//中间四个
memcpy(ID+8,&decx,4);//最后四个
//如果返回 char * ,会出现乱码;故返回 string 值
return string(ID);
}

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);
}

CString GetMac_SN()
{
unsigned long s1,s2;
CString str;

__asm
{
mov eax,0x01
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}

str.Format(_T("%08X%08X"), s1, s2);

return str;
}


//使用上面的函数

void CgetCPUNumberDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码;

CString strCPUID = GetMac_SN();

CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText(strCPUID);

CEdit* pEdit2 = (CEdit*)GetDlgItem(IDC_EDIT2);

long nFreq = GetCPUFreq();      //主频;
string strMaker = GetManID();   //制造商;
string strModel = GetCPUType(); //型号;

CString str("本机CPU信息如下:\r\n\r\n");
CString strTemp;
strTemp.Format(_T("%d"), nFreq);

str += "主频:";
str += strTemp;

str += "\r\n\r\n";
str += "制造商:";
str += CString(strMaker.c_str());

str += "\r\n\r\n";
str += "型号:";
str += CString(strModel.c_str());

pEdit2->SetWindowText(str);

}


//复制到剪贴板

void CgetCPUNumberDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码;

BOOL ret = OpenClipboard();
if (ret != TRUE)
{
AfxMessageBox(_T("打开剪贴板失败!"));
return;
}

EmptyClipboard();

HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 1024);

LPVOID pMem = GlobalLock(hMem);

char* pBuf = (char*)pMem;

CString strCPUID;
GetDlgItemText(IDC_EDIT1, strCPUID);

int i = 0;
int len = strCPUID.GetLength();
char chArray[1024] = {0};

for (i = 0; i < len; ++ i )
{
chArray[i] = strCPUID.GetAt(i);
}
chArray[i] = '\0';

strcpy_s(pBuf, (len + 1) * sizeof(char), chArray);  //把EDIT控件中的数据拷贝至指针指向的内存区域;

GlobalUnlock(hMem);

HANDLE hClipboard = SetClipboardData(CF_TEXT, hMem);

CloseClipboard();
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: