Windows 介面修改 IP 即時生效,追蹤發現 netcfgx.dll 呼叫 dhcpcsvc.dll 內部函式 DhcpNotifyConfigChange。步驟:
{66156DC3-44A4-434C-B8A9-0E5DB4B3EEAD}。可用 GetAdaptersInfo (IP Helper API) 或掃描註冊表 HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000n\Ndi\Interfaces 取得。HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID} 下設定 IPAddress、SubnetMask、DefaultGateway (REG_MULTI_SZ 結尾雙 null)。
typedef BOOL (WINAPI *PFN_DHCPNOTIFY)(LPWSTR, LPWSTR, BOOL, DWORD, DWORD, DWORD, int);
BOOL NotifyIpChange(LPCTSTR adapter, int index, LPCTSTR ip, LPCTSTR mask)
{
HMODULE hDll = LoadLibrary(_T("dhcpcsvc.dll"));
if (!hDll) return FALSE;
PFN_DHCPNOTIFY pFn = (PFN_DHCPNOTIFY)GetProcAddress(hDll, "DhcpNotifyConfigChange");
if (!pFn) { FreeLibrary(hDll); return FALSE; }
WCHAR wAdapter[256]; MultiByteToWideChar(CP_ACP, 0, adapter, -1, wAdapter, 256);
BOOL ret = pFn(NULL, wAdapter, TRUE, index, inet_addr(ip), inet_addr(mask), 0) == ERROR_SUCCESS;
FreeLibrary(hDll);
return ret;
}
註冊表關鍵位置 (四處需同步):
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID} (主設定)HKLM\SYSTEM\CurrentControlSet\Services\{GUID}\Parameters\Tcpip (服務層)ControlSet001 同步 (CurrentControlSet 別名)關鍵步驟:程式化重啟網卡 (對應 Linux ifconfig down/up)。使用 DDK SetupAPI (SetupDiCallClassInstaller 配合 DIF_PROPERTYCHANGE / DICS_DISABLE → DICS_ENABLE) 禁用再啟用裝置。完整代碼較長,參考附件。
TCP/IP 允許單 NIC 綁定多 IP (同一 MAC 對應多 IP)。流程:
AddIPAddress 新增目標 IP。DeleteIPAddress 刪除舊 IP (取得 NTE Context 後)。
// 範例:新增 IP
DWORD dwRet = AddIPAddress(inet_addr("192.168.1.100"), inet_addr("255.255.255.0"), nIfIndex, &nNteContext, &nNteInstance);
// 刪除舊 IP
DeleteIPAddress(oldNteContext);
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| DhcpNotifyConfigChange | 模擬介面操作、單次生效、支援 DHCP 狀態切換 | 未公開 API、版本相容風險 | 需完整模擬 GUI 行為 |
| 註冊表 + 重啟網卡 | 標準、穩定、持久化 | 需 SetupAPI、重啟網卡延遲較大 | 系統管理工具、永久修改 |
| AddIPAddress / DeleteIPAddress | 極快、無相依、支援多 IP 共存 | 非永久 (重啟失效)、舊 IP 可能殘留連線 | 臨時切換、測試、多 IP 管理 |