Most Politically Correct Way To Call RasHangUp

Environment: VC5-6, Win9x-NT4


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.


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;
    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))
        dwRet = RasGetConnectStatus(hRasConn, &rStatus);

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