2011-09-30 16 views
11

sto cercando di ottenere l'indirizzo MAC su Windows XP utilizzando questo codice:Ottenere indirizzo MAC sulle finestre in 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; 
} 

Il codice è stato suggerito qui: http://www.qtforum.org/post/42589/how-to-obtain-mac-address.html#post42589

Quali biblioteche devo includere per renderlo lavoro?.

risposta

37

Con Qt e il modulo QtNetwork, è possibile ottenere uno degli indirizzi MAC del genere:

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

il compilatore Windows e MSVC, è necessario sostituire l ' "interfaccia" variabile QNetworkInterface con qualcos'altro, altrimenti la compilazione fallisce. Vedi anche questo thread per la spiegazione: http://qt-project.org/forums/viewthread/19133 –

+1

Funziona anche su Ubuntu – PedroMorgan

+0

Quando WiFi non è connesso su Android, l'interfaccia diventa loopback e 'hardwareAddress()' legge come '00 : 00: 00: 00: 00: 00'. –

3

che stavo cercando la stessa e ha avuto alcuni problemi con le macchine virtuali e diversi tipi di portatori, ecco un altro approccio che ho trovato:

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; 
    } 
} 
Problemi correlati