MSDN 文檔與示例代碼在 Windows XP SP3 及以上版本**存在錯誤**:首次調用 RasEnumConnections 時傳入 NULL 獲取緩衝區大小,官方說明應返回 ERROR_BUFFER_TOO_SMALL,實際返回 ERROR_INVALID_SIZE (632)。
DWORD dwCb = 0; DWORD dwRet = RasEnumConnections(NULL, &dwCb, &dwConnections); // 期望 dwRet == ERROR_BUFFER_TOO_SMALL,實際返回 632
NULL 指針並返回所需緩衝區大小。RASCONN 結構**,且 dwSize 成員正確設置為 sizeof(RASCONN)。NULL 導致參數校驗失敗,返回 ERROR_INVALID_SIZE。DWORD dwCb = 0;
DWORD dwRet = ERROR_SUCCESS;
DWORD dwConnections = 0;
// 關鍵:分配一個 RASCONN 結構並設置 dwSize
LPRASCONN lpRasConn = (LPRASCONN)HeapAlloc(GetProcessHeap(), 0, sizeof(RASCONN));
lpRasConn->dwSize = sizeof(RASCONN); // 必須設置!
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
if (dwRet == ERROR_BUFFER_TOO_SMALL) {
// dwCb 現在包含所需總緩衝區大小
HeapFree(GetProcessHeap(), 0, lpRasConn);
lpRasConn = (LPRASCONN)HeapAlloc(GetProcessHeap(), 0, dwCb);
lpRasConn->dwSize = sizeof(RASCONN); // 重新設置
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
// 後續處理 dwConnections 個連接...
}
if (lpRasConn) HeapFree(GetProcessHeap(), 0, lpRasConn);
dwSize**,而非傳 NULL,兼容所有 Windows 版本。dwSize 應硬編碼為該系統的 RASCONN 結構大小(可通過 GetVersionEx 判斷系統版本動態設置)。RasEnumConnections 前務必檢查 RasGetErrorString 獲取可讀錯誤信息。