擷取當前電腦所有網路連接名字

來源:互聯網
上載者:User

標籤:

最近因為項目有需要擷取原生所有存在的網路連接名稱,在網上也找了資料,有好幾種方法,不過就只有一種是能夠達到我想要的要求

寫下來給大家參考下

第一種方法:遍曆註冊表來擷取

void __fastcall MyGetLanAdapterName(char *szLanAdapterName){    HKEY hKey, hSubKey, hNdiIntKey;    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,        "System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}",        0,        KEY_READ,        &hKey) != ERROR_SUCCESS)        return;    DWORD dwIndex = 0;    DWORD dwBufSize = 256;    DWORD dwDataType;    char szSubKey[256];    unsigned char szData[256];    while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)    {        if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)        {            if(RegOpenKeyEx(hSubKey, "Ndi\\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)            {                dwBufSize = 256;                if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)                {                    if(strcmp((char*)szData, "ethernet") == 0) // 判斷是不是乙太網路卡                    {                        dwBufSize = 256;                        if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)                        {                            // szData 中便是適配器詳細描述                            dwBufSize = 256;                            if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)                            {                                //szData中便是適配器名稱                                strcpy(szLanAdapterName, (char *)szData);                            }                        }                    }                }                RegCloseKey(hNdiIntKey);            }            RegCloseKey(hSubKey);        }        dwBufSize = 256;    } /* end of while */    RegCloseKey(hKey);}

szLanAdapterName即為網路連接的名稱 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D}

第二種方法是通過API:

void __fastcall GetLanAdapterName(){    ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);    IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];    if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 緩衝區不夠大    {        delete pAdapterInfo;        pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];        pAdapterInfoBkp = pAdapterInfo;    }    if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )    {        do{ // 遍曆所有適配器            if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 判斷是否為乙太網路介面            {                // pAdapterInfo->Description 是適配器描述                // pAdapterInfo->AdapterName 是適配器名稱            }            pAdapterInfo = pAdapterInfo->Next;        }while(pAdapterInfo);    }    delete pAdapterInfoBkp;}

AdapterName 也能得到網路連接的名稱 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D} 適配器描述如:Realtek RTL8139(A) PCI Fast Ethernet Adapter

第三種方法也是使用API:

void __fastcall GetLanAdapterName(){   HANDLE   hMprConfig;    DWORD   dwRet=0;    CString   strInfo,strTmp;    PIP_INTERFACE_INFO   plfTable=NULL;    IP_ADAPTER_INDEX_MAP   AdaptMap;    DWORD   dwBufferSize=0;    WCHAR   szFriendName[256];    DWORD   tchSize=sizeof(WCHAR)*256;    ZeroMemory(&szFriendName,tchSize);    dwRet=MprConfigServerConnect   (NULL,&hMprConfig);    dwRet=GetInterfaceInfo(NULL,&dwBufferSize);    if(dwRet==ERROR_INSUFFICIENT_BUFFER)    {        plfTable=(PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize);        GetInterfaceInfo(plfTable,&dwBufferSize);    }    strInfo.Empty();    for(UINT   i=0;i<plfTable->NumAdapters;i++)    {        AdaptMap=plfTable->Adapter[i];        dwRet=MprConfigGetFriendlyName(hMprConfig,AdaptMap.Name,(PWCHAR)szFriendName,tchSize);        char szName[256];        memset( szName, 0, 256 );        int nLen = WideCharToMultiByte( CP_ACP,NULL, szFriendName,-1,NULL,0,NULL,FALSE );        WideCharToMultiByte (CP_ACP,NULL,szFriendName,-1,szName,nLen,NULL,FALSE);        strTmp.Format(_T("Index:%u\nName:%s\n"),AdaptMap.Index,szName);   //szName即為網路連接的名稱        strInfo+=strTmp;    }    HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,plfTable);}

szName即為網路連接的名稱,如 "本地串連","本地串連1"...後面通過API函數擷取需要加入下面標頭檔

#include <Mprapi.h>  #include <iphlpapi.h>  #pragma comment( lib, "Iphlpapi.lib" )  #pragma comment( lib, "Mprapi.lib" )

當然, 我需要的是擷取網路連接的顯示名字,所以選擇第三種方法




著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

擷取當前電腦所有網路連接名字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.