1 #include <QCoreApplication> 2 #include <QStringList> 3 #include <QString> 4 #include <qdebug.h> 5 #include <QNetworkInterface> 6 7 #ifdef __GNUC__ 8 #include <cpuid.h> 9 #elif defined(_MSC_VER) 10 #if _MSC_VER >= 1400 11 #include <intrin.h> 12 #endif 13 #else 14 #error Only supports MSVC or GCC 15 #endif 16 17 QStringList get_mac(); 18 void getcpuid(unsigned int CPUInfo[4], unsigned int InfoType); 19 void getcpuidex(unsigned int CPUInfo[4], unsigned int InfoType, unsigned int ECXValue); 20 QString get_cpuId(); 21 22 int main(int argc, char *argv[]) 23 { 24 QCoreApplication a(argc, argv); 25 //测试cpu_id 26 QString cpu_id = ""; 27 cpu_id = get_cpuId(); 28 qDebug() << cpu_id; 29 //测试mac 30 QStringList mac_list; 31 mac_list = get_mac(); 32 for (int i=0; i<mac_list.size(); i++) 33 { 34 qDebug() << mac_list.at(i); 35 } 36 return a.exec(); 37 } 38 39 //获取机器mac地址 40 QStringList get_mac() 41 { 42 QStringList mac_list; 43 QString strMac; 44 QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces(); 45 for (int i=0; i<ifaces.count(); i++) 46 { 47 QNetworkInterface iface = ifaces.at(i); 48 //过滤掉本地回环地址、没有开启的地址 49 if (iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack)) 50 { 51 //过滤掉虚拟地址 52 if (!(iface.humanReadableName().contains("VMware",Qt::CaseInsensitive))) 53 { 54 strMac = iface.hardwareAddress(); 55 mac_list.append(strMac); 56 } 57 } 58 } 59 return mac_list; 60 } 61 62 //获取机器cpuId 63 QString get_cpuId() 64 { 65 QString cpu_id = ""; 66 unsigned int dwBuf[4]; 67 unsigned long long ret; 68 getcpuid(dwBuf, 1); 69 ret = dwBuf[3]; 70 ret = ret << 32; 71 cpu_id = QString::number(dwBuf[3], 16).toUpper(); 72 cpu_id = cpu_id + QString::number(dwBuf[0], 16).toUpper(); 73 return cpu_id; 74 } 75 76 void getcpuid(unsigned int CPUInfo[4], unsigned int InfoType) 77 { 78 #if defined(__GNUC__)// GCC 79 __cpuid(InfoType, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); 80 #elif defined(_MSC_VER)// MSVC 81 #if _MSC_VER >= 1400 //VC2005才支持__cpuid 82 __cpuid((int*)(void*)CPUInfo, (int)(InfoType)); 83 #else //其他使用getcpuidex 84 getcpuidex(CPUInfo, InfoType, 0); 85 #endif 86 #endif 87 } 88 89 void getcpuidex(unsigned int CPUInfo[4], unsigned int InfoType, unsigned int ECXValue) 90 { 91 #if defined(_MSC_VER) // MSVC 92 #if defined(_WIN64) // 64位下不支持内联汇编. 1600: VS2010, 据说VC2008 SP1之后才支持__cpuidex. 93 __cpuidex((int*)(void*)CPUInfo, (int)InfoType, (int)ECXValue); 94 #else 95 if (NULL==CPUInfo) return; 96 _asm{ 97 // load. 读取参数到寄存器. 98 mov edi, CPUInfo; 99 mov eax, InfoType; 100 mov ecx, ECXValue; 101 // CPUID 102 cpuid; 103 // save. 将寄存器保存到CPUInfo 104 mov [edi], eax; 105 mov [edi+4], ebx; 106 mov [edi+8], ecx; 107 mov [edi+12], edx; 108 } 109 #endif 110 #endif 111 }
时间: 2024-08-02 19:14:07