以下为我网上找的代码。经过调试可以获得mac。但是我如果装一张无线网卡进去,能够看到两个mac。但是却不能知道那个是无线那个是有线(pci),因为打算把mac 作为软件的注册信息。所以只能取一个,而且统一起来只取pci网卡的macid 。兄弟才疏学浅。才来此拜山头。分数不多。能给好多给好多。
bool CLifeApp::dywkid()
{ char tempChar; 
ULONG uListSize=1; 
PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息 
int nAdapterIndex = 0; DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize); // 关键函数 if (dwRet == ERROR_BUFFER_OVERFLOW) 

PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]); 
dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize); 
if (dwRet == ERROR_SUCCESS) 

pAdapter = pAdapterListBuffer; 
while (pAdapter) // 枚举网卡 

    u_char g_ucLocalMac[6];  
memcpy(g_ucLocalMac, pAdapter->Address,6);
u_char *p = g_ucLocalMac;
wkidku[nAdapterIndex].Format("%02X%02X%02X", p[3], p[4], p[5]);
AfxMessageBox(wkidku[nAdapterIndex] );
AdapterList[nAdapterIndex].dwIndex = pAdapter->Index; // 编号 pAdapter = pAdapter->Next; nAdapterIndex ++; 

delete pAdapterListBuffer; 


return false;

解决方案 »

  1.   

    这里我只取了网卡的后面六位,因为用汇编获得了cpuid。而现在的cpuid好多只要是同型号,id都一样,起不到唯一标示的作用了。所以加上macid。
    我就想问下取那个值能够看到网卡是不是pci的特征
      

  2.   

      我在自己的电脑上测试了下,我第二个的是本机的有线卡,不知道你测试的情况:
      // 全局数据
    u_char g_ucLocalMac[6]; // 本地MAC地址
    DWORD g_dwGatewayIP; // 网关IP地址
    DWORD g_dwLocalIP; // 本地IP地址
    DWORD g_dwMask; // 子网掩码BOOL GetGlobalData()
    {
    PIP_ADAPTER_INFO pAdapterInfo = NULL;
    ULONG ulLen = 0; // 为适配器结构申请内存
    ::GetAdaptersInfo(pAdapterInfo,&ulLen);
    pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen); // 取得本地适配器结构信息
    if(::GetAdaptersInfo(pAdapterInfo,&ulLen) ==  NO_ERROR )
    {
    pAdapterInfo=pAdapterInfo->Next;//由于自己是双网卡,第一个是无线网卡,第二个才有信息.
    if(pAdapterInfo != NULL)
    {
    memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
    g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
    g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
    g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
    }
    } printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
    in_addr in;
    in.S_un.S_addr = g_dwLocalIP;
    printf("      IP Address : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwMask;
    printf("     Subnet Mask : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwGatewayIP;
    printf(" Default Gateway : %s \n", ::inet_ntoa(in)); u_char *p = g_ucLocalMac;
    printf("     MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]); printf(" \n \n "); return TRUE;
    }  
      

  3.   

    谢谢楼上兄弟。你的代码前几天我网上看到过类似的。这种代码无法解决问题。因为没有对获得的数据进行判断。
        我这个问题的关键是如何从获得多个网卡信息中进行判断。最终找出pci网卡的mac。
    // 取得本地适配器结构信息 
    if(::GetAdaptersInfo(pAdapterInfo,&ulLen) ==  NO_ERROR ) 

    pAdapterInfo=pAdapterInfo->Next;//由于自己是双网卡,第一个是无线网卡,第二个才有信息. 
    这种直接获取到信息后就next的方法是行不通的。因为不能确定第一个还是第二个是无线网卡,也就是说他们的排列顺序问题。
    while (pAdapter) // 枚举网卡  
    {  
        u_char g_ucLocalMac[6];   
    memcpy(g_ucLocalMac, pAdapter->Address,6); 
    u_char *p = g_ucLocalMac; 
    wkidku[nAdapterIndex].Format("%02X%02X%02X", p[3], p[4], p[5]); 
    AfxMessageBox(wkidku[nAdapterIndex] ); 
    AdapterList[nAdapterIndex].dwIndex = pAdapter->Index; // 编号  pAdapter = pAdapter->Next;  nAdapterIndex ++;  
    }  
    我使用的如上代码是循环取出。目前困扰我的就是如何从取出的资料中区分pci的mac
    再次谢谢楼上老兄,继续求解
      

  4.   

    不知道汇编方法可以获得pci mac的id不。下面是我网上找到的用汇编方式提取的 cpuid 。我不会这个,看不懂,不知道能不能改成获取pci网卡或者biosid的代码
    int iEAXValue, iEBXValue, iECXValue, iEDXValue;
    _asm
    {
        mov eax, 01h
        // xor edx,edx
        cpuid
        mov iEDXValue, edx
        mov iEAXValue, eax
    }
    _asm
    {
        mov eax, 03h
        xor ecx, ecx
        xor edx, edx
        cpuid
        mov iEBXValue, edx
        mov iECXValue, ecx
    }//获取cpuid
      
    CPUID.Format( "%d%d%d%d", iEAXValue, iEBXValue, iECXValue, iEDXValue );