Windows CE 環境で、システムにダイヤルアップネットワークが構成されていない場合、コードを使用してダイヤルアップネットワークを作成し、インターネット接続を実現する必要があります。
以下のコード内のパラメータとダイヤル値は、中国電信のEVDO設定に基づいています。GSMまたはWCDMAに切り替える場合は、適宜修正してください。
HRASCONN g_hRasConnection = NULL;
// シリアルポートのボーレート、データビットなどを設定
BOOL SetDeviceConfig(LPCTSTR pszEntryName)
{
HKEY hKey;
BYTE devConfig[684] = {0};
TCHAR regPath[513];
DWORD* pEapData = NULL;
ZeroMemory(regPath, sizeof(regPath));
devConfig[0] = 0x30;
devConfig[4] = 0x05;
devConfig[9] = 0x01;
devConfig[13] = 0xC2; // ボーレート設定
devConfig[14] = 0x01;
devConfig[18] = 0x08; // データビット
wsprintf(regPath, L"Comm\\RasBook\\%s", pszEntryName);
if (RegOpenKeyEx(HKEY_CURRENT_USER, regPath, 0, 0, &hKey) == ERROR_SUCCESS)
{
RegSetValueEx(hKey, L"DevCfg", 0, REG_BINARY, devConfig, sizeof(devConfig));
RegSetValueEx(hKey, L"EapConnData", 0, REG_BINARY, (LPBYTE)pEapData, 0);
RegFlushKey(HKEY_CURRENT_USER);
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
BOOL CreateRasEntry(LPCTSTR pszEntryName, LPCTSTR pszModemName)
{
LPRASENTRY pEntry = NULL;
DWORD entrySize = sizeof(RASENTRY);
DWORD bufferSize = 0;
DWORD result = 0;
if (!pszEntryName || !pszModemName)
return FALSE;
RasGetEntryProperties(NULL, L"", NULL, &bufferSize, NULL, NULL);
if (bufferSize == 0)
return FALSE;
pEntry = (LPRASENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferSize);
if (!pEntry)
return FALSE;
ZeroMemory(pEntry, sizeof(RASENTRY));
pEntry->dwSize = bufferSize;
pEntry->dwfOptions = RASEO_RemoteDefaultGateway;
pEntry->dwCountryCode = 86;
lstrcpy(pEntry->szAreaCode, L"10");
lstrcpy(pEntry->szLocalPhoneNumber, L"#777");
lstrcpy(pEntry->szDeviceType, RASDT_Modem);
lstrcpy(pEntry->szDeviceName, pszModemName);
pEntry->dwfNetProtocols = RASNP_Ip;
pEntry->dwFramingProtocol = RASFP_Ppp;
result = RasSetEntryProperties(NULL, pszEntryName, pEntry, bufferSize, NULL, 0);
HeapFree(GetProcessHeap(), 0, pEntry);
return (result == 0);
}
BOOL DialAndSetParameters(LPCTSTR pszEntryName)
{
RASDIALPARAMS dialParams = {0};
dialParams.dwSize = sizeof(RASDIALPARAMS);
wcscpy(dialParams.szEntryName, pszEntryName);
wcscpy(dialParams.szUserName, L"card");
wcscpy(dialParams.szPassword, L"card");
g_hRasConnection = NULL;
DWORD result = RasDial(NULL, NULL, &dialParams, 0xFFFFFFFF, NULL, &g_hRasConnection);
if (result != 0)
{
RETAILMSG(1, (L"RasDial Error: %d.\r\n", result));
return FALSE;
}
return TRUE;
}
使用例:
void CNetworkDialog::OnButtonOpenNetwork()
{
GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE);
m_networkNameCtrl.EnableWindow(FALSE);
if (CreateRasEntry(RAS_ENTRY_NAME, RAS_MODEM_NAME))
{
if (SetDeviceConfig(RAS_ENTRY_NAME))
{
if (DialAndSetParameters(RAS_ENTRY_NAME))
{
RETAILMSG(1, (L"[Network] Dial connection succeeded.\r\n"));
SetTimer(RAS_TIMER_ID, RAS_TIMEOUT, NULL);
}
else
{
RETAILMSG(1, (L"[Network] Dial connection failed!\r\n"));
}
}
else
{
RETAILMSG(1, (L"[Network] Device configuration failed!\r\n"));
}
}
else
{
RETAILMSG(1, (L"[Network] RAS entry creation failed!\r\n"));
}
}
BOOL CNetworkDialog::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_RASDIALEVENT:
OnRasDialEvent(pMsg->wParam, pMsg->lParam);
break;
case WM_USER + 0x1000:
if (pMsg->wParam == 1)
SetDlgItemText(IDC_STATIC_PING, L"PING 状态: 成功");
else
SetDlgItemText(IDC_STATIC_PING, L"PING 状态: 失败");
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
LRESULT CNetworkDialog::OnRasDialEvent(WPARAM wParam, LPARAM lParam)
{
RASCONNSTATE state = (RASCONNSTATE)wParam;
DWORD error = (DWORD)lParam;
g_currentRasState = state;
switch (state)
{
case RASCS_OpenPort:
RETAILMSG(1, (L"[RAS Event] 1. Opening port\r\n"));
break;
case RASCS_PortOpened:
RETAILMSG(1, (L"[RAS Event] 2. Port opened\r\n"));
break;
case RASCS_DeviceConnected:
RETAILMSG(1, (L"[RAS Event] 3. Device connected\r\n"));
break;
case RASCS_AllDevicesConnected:
RETAILMSG(1, (L"[RAS Event] 4. All devices connected\r\n"));
break;
case RASCS_Authenticate:
RETAILMSG(1, (L"[RAS Event] 5. Authenticating\r\n"));
break;
case RASCS_Authenticated:
RETAILMSG(1, (L"[RAS Event] 6. Authenticated, continuing login...\r\n"));
break;
case RASCS_AuthNotify:
RETAILMSG(1, (L"[RAS Event] AuthNotify received, error: %d\r\n", error));
break;
case RASCS_Connected:
RETAILMSG(1, (L"[RAS Event] 7. Connected\r\n"));
g_networkConnected = TRUE;
break;
case RASCS_Disconnected:
{
CString errorMsg;
errorMsg.Format(L"Network error: %d", error);
GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(TRUE);
m_networkNameCtrl.EnableWindow(TRUE);
g_dialTimerCount = 0;
SetDlgItemText(IDC_STATIC_STATUS, errorMsg);
KillTimer(RAS_TIMER_ID);
RETAILMSG(1, (L"[RAS Event] 8. Disconnected, error: %d\r\n", error));
break;
}
default:
RETAILMSG(1, (L"[RAS Event] 9. Other state: %d\r\n", state));
break;
}
return TRUE;
}