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...