2011-09-30 33 views
11

我试图用这个代码在Windows XP上获得MAC地址的Windows地址:获取MAC Qt中

QString getMacAddress() 
{ 
QString macaddress="??:??:??:??:??:??"; 
#ifdef Q_WS_WIN 
PIP_ADAPTER_INFO pinfo=NULL; 

unsigned long len=0; 
unsigned long nError; 

if (pinfo!=NULL) 
delete (pinfo); 

nError = GetAdaptersInfo(pinfo,&len); //Have to do it 2 times? 

if(nError != 0) 
{ 
pinfo= (PIP_ADAPTER_INFO)malloc(len); 
nError = GetAdaptersInfo(pinfo,&len); 
} 

if(nError == 0) 
macaddress.sprintf("%02X:%02X:%02X:%02X:%02X:%02X",pinfo->Address[0],pinfo->Address[1],pinfo->Address[2],pinfo->Address[3],pinfo->Address[4],pinfo->Address[5]); 
#endif 
return macaddress; 
} 

的代码是在这里建议:http://www.qtforum.org/post/42589/how-to-obtain-mac-address.html#post42589

我应该包括哪些图书馆使它工作?。

回答

37

随着Qt和QtNetwork模块,你可以得到这样的MAC地址之一:

QString getMacAddress() 
{ 
    foreach(QNetworkInterface netInterface, QNetworkInterface::allInterfaces()) 
    { 
     // Return only the first non-loopback MAC Address 
     if (!(netInterface.flags() & QNetworkInterface::IsLoopBack)) 
      return netInterface.hardwareAddress(); 
    } 
    return QString(); 
} 
+1

在Windows和MSVC编译器上,应该用别的东西替换QNetworkInterface变量“interface”,否则编译失败。另请参阅以下主题以获取解释:http://qt-project.org/forums/viewthread/19133 –

+1

在Ubuntu上工作也 – PedroMorgan

+0

当Android没有连接WiFi时,接口变为环回并且'hardwareAddress()'读作'00 :00:00:00:00:00'。 –

3

我一直在寻找相同的,有一些问题,虚拟机和不同类型的承载,这里的另一个我发现:

QNetworkConfiguration nc; 
QNetworkConfigurationManager ncm; 
QList<QNetworkConfiguration> configsForEth,configsForWLAN,allConfigs; 
// getting all the configs we can 
foreach (nc,ncm.allConfigurations(QNetworkConfiguration::Active)) 
{ 
    if(nc.type() == QNetworkConfiguration::InternetAccessPoint) 
    { 
     // selecting the bearer type here 
     if(nc.bearerType() == QNetworkConfiguration::BearerWLAN) 
     { 
      configsForWLAN.append(nc); 
     } 
     if(nc.bearerType() == QNetworkConfiguration::BearerEthernet) 
     { 
      configsForEth.append(nc); 
     } 
    } 
} 
// further in the code WLAN's and Eth's were treated differently 
allConfigs.append(configsForWLAN); 
allConfigs.append(configsForEth); 
QString MAC; 
foreach(nc,allConfigs) 
{ 
    QNetworkSession networkSession(nc); 
    QNetworkInterface netInterface = networkSession.interface(); 
    // these last two conditions are for omiting the virtual machines' MAC 
    // works pretty good since no one changes their adapter name 
    if(!(netInterface.flags() & QNetworkInterface::IsLoopBack) 
      && !netInterface.humanReadableName().toLower().contains("vmware") 
      && !netInterface.humanReadableName().toLower().contains("virtual")) 
    { 
     MAC = QString(netInterface.hardwareAddress()); 
     break; 
    } 
}