首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

VB 調用 RasEnumConnections 返回 632 (ERROR_INVALID_SIZE) 錯誤的修正方案

     編輯:PHP 綜合知識

MSDN 文檔與示例代碼在 Windows XP SP3 及以上版本**存在錯誤**:首次調用 RasEnumConnections 時傳入 NULL 獲取緩衝區大小,官方說明應返回 ERROR_BUFFER_TOO_SMALL,實際返回 ERROR_INVALID_SIZE (632)。

錯誤示例(MSDN 原版)

DWORD dwCb = 0;
DWORD dwRet = RasEnumConnections(NULL, &dwCb, &dwConnections);
// 期望 dwRet == ERROR_BUFFER_TOO_SMALL,實際返回 632

根因分析

  • 早期 Windows 版本接受 NULL 指針並返回所需緩衝區大小。
  • XP SP3+ 安全加固:**要求第一個參數必須指向有效的 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 版本。
  • 若需在極早期系統(Win95/NT4)運行,dwSize 應硬編碼為該系統的 RASCONN 結構大小(可通過 GetVersionEx 判斷系統版本動態設置)。
  • 調用 RasEnumConnections 前務必檢查 RasGetErrorString 獲取可讀錯誤信息。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved