原文链接地址:https://www.cnblogs.com/gccbuaa/p/6708774.html
近期由于项目有须要获取本机的全部存在的网络连接名称,在网上也找了资料,有好几种方法,只是就仅仅有一种是可以达到我想要的要求
写下来给大家參考下
第一种方法:遍历注冊表来获取
1 void __fastcall MyGetLanAdapterName(char *szLanAdapterName) 2 { 3 HKEY hKey, hSubKey, hNdiIntKey; 4 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 5 "System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}", 6 0, 7 KEY_READ, 8 &hKey) != ERROR_SUCCESS) 9 return; 10 11 DWORD dwIndex = 0; 12 DWORD dwBufSize = 256; 13 DWORD dwDataType; 14 char szSubKey[256]; 15 unsigned char szData[256]; 16 17 while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 18 { 19 if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS) 20 { 21 if(RegOpenKeyEx(hSubKey, "Ndi\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS) 22 { 23 dwBufSize = 256; 24 if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS) 25 { 26 if(strcmp((char*)szData, "ethernet") == 0) // 推断是不是以太网卡 27 { 28 dwBufSize = 256; 29 if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS) 30 { 31 // szData 中便是适配器具体描写叙述 32 dwBufSize = 256; 33 if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS) 34 { 35 //szData中便是适配器名称 36 strcpy(szLanAdapterName, (char *)szData); 37 } 38 } 39 } 40 } 41 RegCloseKey(hNdiIntKey); 42 } 43 RegCloseKey(hSubKey); 44 } 45 dwBufSize = 256; 46 } /* end of while */ 47 RegCloseKey(hKey); 48 }
szLanAdapterName即为网络连接的名称 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D}
另外一种方法是通过API:
1 void __fastcall GetLanAdapterName() 2 { 3 ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO); 4 IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize]; 5 if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大 6 { 7 delete pAdapterInfo; 8 pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize]; 9 pAdapterInfoBkp = pAdapterInfo; 10 } 11 if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS ) 12 { 13 do{ // 遍历全部适配器 14 if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 推断是否为以太网接口 15 { 16 // pAdapterInfo->Description 是适配器描写叙述 17 // pAdapterInfo->AdapterName 是适配器名称 18 } 19 pAdapterInfo = pAdapterInfo->Next; 20 }while(pAdapterInfo); 21 } 22 delete pAdapterInfoBkp; 23 }
AdapterName 也能得到网络连接的名称 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D} 适配器描写叙述如:Realtek RTL8139(A) PCI Fast Ethernet Adapter
第三种方法也是使用API:
1 void __fastcall GetLanAdapterName() 2 { HANDLE hMprConfig; 3 DWORD dwRet=0; 4 CString strInfo,strTmp; 5 PIP_INTERFACE_INFO plfTable=NULL; 6 IP_ADAPTER_INDEX_MAP AdaptMap; 7 DWORD dwBufferSize=0; 8 WCHAR szFriendName[256]; 9 DWORD tchSize=sizeof(WCHAR)*256; 10 ZeroMemory(&szFriendName,tchSize); 11 12 dwRet=MprConfigServerConnect (NULL,&hMprConfig); 13 dwRet=GetInterfaceInfo(NULL,&dwBufferSize); 14 15 if(dwRet == ERROR_INSUFFICIENT_BUFFER) 16 { 17 plfTable=(PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize); 18 GetInterfaceInfo(plfTable,&dwBufferSize); 19 } 20 strInfo.Empty(); 21 for(UINT i=0;i<plfTable->NumAdapters;i++) 22 { 23 AdaptMap=plfTable->Adapter[i]; 24 dwRet=MprConfigGetFriendlyName(hMprConfig,AdaptMap.Name,(PWCHAR)szFriendName,tchSize); 25 26 27 char szName[256]; 28 memset( szName, 0, 256 ); 29 int nLen = WideCharToMultiByte( CP_ACP,NULL, szFriendName,-1,NULL,0,NULL,FALSE ); 30 WideCharToMultiByte (CP_ACP,NULL,szFriendName,-1,szName,nLen,NULL,FALSE); 31 strTmp.Format(_T("Index:%u Name:%s "),AdaptMap.Index,szName); //szName即为网络连接的名称 32 strInfo+=strTmp; 33 } 34 35 HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,plfTable); 36 }
szName即为网络连接的名称,如 "本地连接","本地连接1"...后面通过API函数获取须要增加以下头文件
1 #include <Mprapi.h> 2 #include <iphlpapi.h> 3 #pragma comment( lib, "Iphlpapi.lib" ) 4 #pragma comment( lib, "Mprapi.lib" )
当然, 我须要的是获取网络连接的显示名字,所以选择第三种方法
AdaptMap.Index=pAdapterInfo->Index进行匹配