2008-10-21 12 views
10

हम वर्तमान में NetBios method का उपयोग कर रहे हैं, और यह XP के तहत ठीक काम करता है। विस्टा के तहत प्रारंभिक परीक्षण से पता चलता है कि यह भी काम करता है, लेकिन चेतावनी है - उदाहरण के लिए नेटबीओएसओ मौजूद होना चाहिए, और जो कुछ मैं पढ़ रहा हूं, उससे एडाप्टर का क्रम बदलना है। हमारी वैकल्पिक विधि - SNMPExtensionQuery के साथ - Vista के तहत टूटा हुआ प्रतीत होता है।सी ++: Vista पर नेटवर्क एडेप्टर के मैक पते प्राप्त करें?

सवाल यह है: क्या आप Vista मशीन पर स्थानीय मैक पते की सूची प्राप्त करने के लिए एक विश्वसनीय तरीका जानते हैं? XP के साथ पिछड़ा संगतता एक प्लस है (मैं बदसूरत # ifdef की तुलना में एक एकल विधि की बजाय)। धन्यवाद!

+0

http://stackoverflow.com/questions/823553/how-to-get-hardware-mac-address-on-windows इन करने की जरूरत है –

उत्तर

2

क्या आप WMIService का उपयोग कर सकते हैं? मैंने इसे प्री-विस्टा दिनों में मशीन के मैक-एड्रेस को प्राप्त करने के लिए इस्तेमाल किया था।

+0

धन्यवाद, यह मेरी समस्या का सबसे साफ समाधान प्रतीत होता है। – Laur

0

GetAdaptersInfo() आधिकारिक विधि है, यह सभी एडाप्टर को डिस्कनेक्ट किए गए भी समझाता है।
उदाहरण के लिए इस पोस्ट को देखें codeguru

+0

गलत होना चाहिए। GetAdaptersInfo() अक्षम किए गए एडेप्टर को समझा नहीं सकता है। कोड गुरु आलेख भी इस तथ्य को बताता है: "अंत में यह भी काम करता है यदि आपके एनआईसी वैध नेटवर्क से जुड़े नहीं हैं (उदाहरण के लिए तारों को भी झुकाया नहीं जाता है), लेकिन एनआईसी को विंडोज़ में" सक्षम "होना चाहिए" – 0xC0DEFACE

+0

इसके अलावा, टीसीपी/आईपी प्रोटोकॉल अक्षम वाला कार्ड GetAdaptersInfo() द्वारा नहीं पहचाना जाएगा। –

+0

GetAdaptersInfo अक्षम एडाप्टर –

17

यह आपको आपके कंप्यूटर पर सभी मैक पते की एक सूची देगा। यह विंडोज के सभी संस्करणों के साथ साथ ही काम करेगा:

void getdMacAddresses(std::vector<std::string> &vMacAddresses;) 
{ 
    vMacAddresses.clear(); 
    IP_ADAPTER_INFO AdapterInfo[32];  // Allocate information for up to 32 NICs 
    DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer 
    DWORD dwStatus = GetAdaptersInfo(  // Call GetAdapterInfo 
    AdapterInfo,     // [out] buffer to receive data 
    &dwBufLen);     // [in] size of receive data buffer 

    //No network card? Other error? 
    if(dwStatus != ERROR_SUCCESS) 
     return; 

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 
    char szBuffer[512]; 
    while(pAdapterInfo) 
    { 
     if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) 
     { 
      sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x" 
       , pAdapterInfo->Address[0] 
       , pAdapterInfo->Address[1] 
       , pAdapterInfo->Address[2] 
       , pAdapterInfo->Address[3] 
       , pAdapterInfo->Address[4] 
       , pAdapterInfo->Address[5] 
       ); 
      vMacAddresses.push_back(szBuffer); 
     } 
     pAdapterInfo = pAdapterInfo->Next; 

    } 
} 
+0

हाय ब्रायन, हेड-अप के लिए धन्यवाद; इस बीच मुझे यह लिंक मिला (XP और बाद में); मुझे लगता है कि मैं या तो इसके लिए या डब्ल्यूएमआई समाधान के लिए जाऊंगा। http://msdn.microsoft.com/en-us/library/aa365915(VS.85).aspx – Laur

+0

हमने इस विधि का उपयोग हमारे मुख्य उत्पादों में कई वर्षों से किया है। Vista, 2008, 2003, XP, 2000, में अच्छा काम करता है .... –

+0

अद्यतन: और win7 :) –

0
#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <stdio.h> 
#include <vector> 
#include <Windows.h> 
#include <Iphlpapi.h> 
#include <Assert.h> 
#include <string> 
#pragma comment(lib, "iphlpapi.lib") 


char* getdMacAddresses() 
{ 

    IP_ADAPTER_INFO AdapterInfo[32];  // Allocate information for up to 32 NICs 
    DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer 
    DWORD dwStatus = GetAdaptersInfo(  // Call GetAdapterInfo 
     AdapterInfo,     // [out] buffer to receive data 
     &dwBufLen);     // [in] size of receive data buffer 

    //Exit When Error 
    if (dwStatus != ERROR_SUCCESS) 
     return "ERROR"; 

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 
    char szBuffer[512]; 
    while (pAdapterInfo) 
    { 
     if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) 
     { 

      sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x" 
       , pAdapterInfo->Address[0] 
       , pAdapterInfo->Address[1] 
       , pAdapterInfo->Address[2] 
       , pAdapterInfo->Address[3] 
       , pAdapterInfo->Address[4] 
       , pAdapterInfo->Address[5] 
       ); 

      return szBuffer; 

     } 


     pAdapterInfo = pAdapterInfo->Next; 

    } 

    return "ERROR"; 
} 
+0

क्या आप कृपया बता सकते हैं कि यह समस्या का समाधान कैसे करेगा? – Phani

संबंधित मुद्दे