首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

获取CPUID急救!该如何解决

2012-02-25 
获取CPUID急救!!!如题要支持builder 5 的,能测出CPU速度大于2G的CPUID给下源代码,给个相关接口也行。谢谢

获取CPUID急救!!!
如题
要支持builder 5 的,能测出CPU速度大于2G的CPUID;
给下源代码,
给个相关接口也行。
谢谢了

[解决办法]

C/C++ code
String __fastcall GetCPUID(){    #define CPUID dw 0xa20f    DWORD dwCPUName, dwCPUReserved1, dwCPUReserved2, dwCPUID;    String strCPUID;    asm    {        PUSHAD        MOV EAX, 1        CPUID        MOV dwCPUName, EAX        MOV dwCPUReserved1, EBX        MOV dwCPUReserved2, ECX        MOV dwCPUID, EDX        POPAD    }    strCPUID.sprintf("%.8X", dwCPUID);    return strCPUID;}
[解决办法]
一、网上流行的这段代码不能取出CPU的唯一值。
二、Intel原来曾经想搞出CPU的唯一值来着,但是受到多个国家,包括中国的反对。就算有唯一值的CPU,也有很多的主板上有这样一项开关:“是否允许CPU ID被获取”。该事件大约是在P3刚出时。
三、ccrun给出的这段代码可以加以完善一些,可以更好地区分出CPU,修改如下:
C/C++ code
 

String GetCPUID()//取CPUID。
{
  #define CPUID dw 0xa20f
  DWORD dwCPUName, dwCPUReserved1,dwCPUReserved2,dwCPUID;
  String strCPUID;
  asm
  {
    PUSHAD
    MOV EAX, 1
    CPUID
    MOV dwCPUName, EAX
    MOV dwCPUReserved1, EBX
    MOV dwCPUReserved2, ECX
    MOV dwCPUID, EDX
    POPAD
  }
  strCPUID.sprintf("%08X-%08X-%08X", dwCPUID,dwCPUName,dwCPUReserved2);//dwCPUReserved1不用
  return strCPUID;
}



特别说明:dwCPUReserved1在多核、多CPU电脑中因为处理这段代码的CPU的核心不同,会返回不同值。也许如果你想知道这台电脑是否是多核,你可以多次取它的返回值。如果只是想取机器的特征,dwCPUReserved1还是忽略的好。

四、同型号,同一批次的CPU,特别是比如某单位同一批进的同型号的电脑,使用上面的代码,返回的值十之八九相同。

热点排行