遠端存取服務(RAS)是 Windows NT 系統提供的網路服務,讓獨立電腦透過電話線接入網路,或兩地 LAN 互連。雖然使用者可手動操作「撥號網路」,但應用程式若需背景自動撥號/掛斷且對使用者不可見,則必須呼叫 Windows API 實作。本文說明 RasDial、RasHangUp 核心函數用法與完整 VC 範例。
DWORD RasDial(
LPRASDIALEXTENSIONS lpRasDialExtensions, // 擴充參數,通常 NULL
LPCTSTR lpszPhonebook, // 電話簿路徑,NULL 為預設
LPRASDIALPARAMS lpRasDialParams, // 關鍵:撥號參數結構
DWORD dwNotifierType, // 通知類型,0 為同步
LPVOID lpvNotifier, // 回呼函數指標
LPHRASCONN lphRasConn // 輸出:連線控制代碼
);
Raserror.h)RASDIALPARAMS 包含所有撥號設定HRASCONN,掛斷時需用到DWORD RasHangUp(HRASCONN hRasConn);
RasDial 回傳的連線控制代碼| 成員 | 型別 | 說明 |
|---|---|---|
| dwSize | DWORD | 結構體大小,必須填 sizeof(RASDIALPARAMS) |
| szEntryName | TCHAR[] | 撥號連線名稱(電話簿中的項目名) |
| szPhoneNumber | TCHAR[] | 撥打電話號碼 |
| szCallbackNumber | TCHAR[] | 回呼電話號碼 |
| szUserName | TCHAR[] | 登入使用者名稱 |
| szPassword | TCHAR[] | 登入密碼 |
| szDomain | TCHAR[] | 登入網域 |
VOID WINAPI RasDialFunc(
UINT unMsg, // 訊息類型
RASCONNSTATE state, // 目前連線狀態
DWORD dwError // 錯誤碼
);
可在回呼中更新 UI 顯示進度、處理錯誤或記錄日誌。
Rasapi32.lib 靜態庫#include <ras.h> #include <raserror.h>HRASCONN g_hRasConn = NULL; // 連線控制代碼
void OnDialClick() {
RASDIALPARAMS rdParams = {0};
rdParams.dwSize = sizeof(RASDIALPARAMS);
_tcscpy(rdParams.szEntryName, _T("dial")); // 連線項目名
_tcscpy(rdParams.szPhoneNumber, _T("22")); // 內部分機號
_tcscpy(rdParams.szCallbackNumber, _T("*"));
_tcscpy(rdParams.szUserName, _T("dial"));
rdParams.szPassword[0] = _T('\0'); // 無密碼
_tcscpy(rdParams.szDomain, _T("dial"));
g_hRasConn = NULL;
DWORD dwRet = RasDial(NULL, NULL, &rdParams, 0L,
(RASDIALFUNC)RasDialFunc, &g_hRasConn);
if (dwRet != 0) {
// 錯誤處理:可用 RasGetErrorString 取得訊息
TCHAR buf[256];
RasGetErrorString(dwRet, buf, 256);
AfxMessageBox(buf);
}
}
VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE state, DWORD dwError) {
// 可根據 state 更新進度條、顯示狀態文字
// 常見狀態:RASCS_OpenPort, RASCS_PortOpened, RASCS_ConnectDevice,
// RASCS_DeviceConnected, RASCS_Authenticate, RASCS_Authenticated,
// RASCS_Connected(成功)
if (dwError != 0) {
// 記錄錯誤
}
}
void OnHangUpClick() {
if (g_hRasConn) {
DWORD dwRet = RasHangUp(g_hRasConn);
if (dwRet != 0) {
// 錯誤處理
}
g_hRasConn = NULL;
}
}
szEntryName 必須與「撥號網路」中建立的連線名稱完全一致dwNotifierType=0),UI 會阻塞至撥號完成;生產環境建議用非同步模式配合回呼RasGetErrorString 將錯誤碼轉為可讀訊息HRASCONN 應妥善保存,避免多執行緒同時操作同一連線