Windows CE における RAS ダイヤル接続の確立とダイヤル処理

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;
}

5月24日 18:42 投稿