Most Politically Correct Way To Call RasHangUp

Environment: VC5-6, Win9x-NT4

Problem

The RasHangUp function terminates a remote access connection.
The connection is specified with a RAS connection handle.
The function releases all RASAPI32.DLL resources associated with the handle.
(MSDN)

Then, in remarks, it is mentioned that application should sleep about 3
seconds, or until RasGetConnectStatus returns ERROR_INVALID_HANDLE.
In article

Disconnect Dialup Connection
author don’t carry about that but
if you realy just call RasHangUp and exit – you can “hang” both
modem and rnaapp (application that implement Dial-Up Service).
Furthermore, if you do everything as described in MSDN you still may
receive the following error message:
RNAAPP caused an invalid page fault in module xxxx.

Solution

This problem was a besetting sin when I wrote my

Dial-up dialer

program, until I found solution that work in my program now:



    DWORD dwRet;
    RASCONNSTATUS rStatus;
    ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
    rStatus.dwSize = sizeof(RASCONNSTATUS);
    dwRet = RasGetConnectStatus(hRasConn, &rStatus);
    if (dwRet != ERROR_INVALID_HANDLE)
    {
        RasHangUp(hRasConn);  // hRasConn - valid handle to the RAS connection
        MSG msg;
        while (dwRet != ERROR_INVALID_HANDLE)
        {
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        dwRet = RasGetConnectStatus(hRasConn, &rStatus);
    }

Actually, I remove some unimportant shuff so check this code
before using…

History

More by Author

Must Read