標籤:
最近因為項目有需要擷取原生所有存在的網路連接名稱,在網上也找了資料,有好幾種方法,不過就只有一種是能夠達到我想要的要求
寫下來給大家參考下
第一種方法:遍曆註冊表來擷取
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" )
當然, 我需要的是擷取網路連接的顯示名字,所以選擇第三種方法
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
擷取當前電腦所有網路連接名字