在 Windows 平台上取得網路介面卡詳細資訊(MAC 位址、IP 位址、子網路遮罩、預設閘道、WINS/DHCP 伺服器等),最標準的方式是呼叫 IP Helper API (IPHLPAPI) 中的 GetAdaptersInfo 函式。本文提供完整的 C++ 主控台程式範例,展示如何正確配置緩衝區、處理錯誤代碼、解析多張網卡與多重 IP 位址。
Iphlpapi.h、Iphlpapi.lib)。#include <Iphlpapi.h> 並連結 Iphlpapi.lib。CString 簡化字串操作,亦可改用 std::string。NULL 緩衝區,取得所需緩衝區大小(ERROR_BUFFER_OVERFLOW)。malloc),再次呼叫取得 IP_ADAPTER_INFO 鏈結串列。IP_ADAPTER_INFO 結構與其下的 IP_ADDR_STRING 陣列。// 1. 取得所需緩衝區大小
ULONG bufLen = 0;
GetAdaptersInfo(nullptr, &bufLen); // 預期回傳 ERROR_BUFFER_OVERFLOW
// 2. 配置記憶體並取得資料
PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO)malloc(bufLen);
DWORD ret = GetAdaptersInfo(pAdapterInfo, &bufLen);
if (ret != ERROR_SUCCESS) { /* 錯誤處理 */ }
// 3. 遍歷每張網卡
for (PIP_ADAPTER_INFO p = pAdapterInfo; p; p = p->Next) {
// MAC 位址
CString mac;
mac.Format(_T("%02X:%02X:%02X:%02X:%02X:%02X"),
p->Address[0], p->Address[1], p->Address[2],
p->Address[3], p->Address[4], p->Address[5]);
// 多重 IP 位址(IP_ADDR_STRING 鏈結串列)
CString ipList;
for (PIP_ADDR_STRING ip = &p->IpAddressList; ip; ip = ip->Next) {
ipList += ip->IpAddress.String;
if (ip->Next) ipList += _T("\r\n");
}
// 子網路遮罩、閘道、WINS、DHCP
CString mask = p->IpAddressList.IpMask.String;
CString gw = p->GatewayList.IpAddress.String;
CString wins = p->HaveWins ? p->PrimaryWinsServer.IpAddress.String : _T("N/A");
CString dhcp = p->DhcpEnabled ? p->DhcpServer.IpAddress.String : _T("N/A");
// 輸出或儲存...
}
free(pAdapterInfo);
| 代碼 | 常數 | 說明 |
|---|---|---|
| 0 | ERROR_SUCCESS | 成功 |
| 111 | ERROR_BUFFER_OVERFLOW | 緩衝區太小,需重新配置 |
| 232 | ERROR_NO_DATA | 無網路介面卡資訊 |
| 50 | ERROR_NOT_SUPPORTED | 作業系統不支援(極舊版本) |
GetAdaptersAddresses(Vista+)。NetworkAdapterInfo 類別,提供 GetAllAdapters() 回傳 std::vector<Adapter>,方便上層 UI 綁定。Iphlpapi.lib 並處理載入失敗情況。掌握 GetAdaptersInfo 的正確使用模式,即可在任何 Win32/Win64 專案中可靠地取得完整網卡資訊。