獲取當前電腦全部網絡連接名字



近期由於項目有須要獲取本機的全部存在的網絡連接名稱,在網上也找了資料,有好幾種方法,只是就僅僅有一種是可以達到我想要的要求

寫下來給大家參考下

第一種方法:遍歷注冊表來獲取

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" )

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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM