Figure 3a: Callback registering

BOOL CRemoteConnect::installCallback()
{
    // install TAPI callback handler
    // - inform user of re-init error to allow infinite retry
    //   (5sec between attempts)
    // - IF user cancels retry, record cancel (install fails)
    // = IF no modem devices installed, record error
    //   (install fails)
    // Return install pass/fail
    while (lineInitialize(&m_TapiStruct.hTAPI, ghInst,
            m_TapiStruct.CallbackProc =
               (LINECALLBACK) MakeProcInstance(
                  (FARPROC)CRemoteConnect::StaticLineCallBackProc,
                  hInst),
            "TAPIProcess",
            &m_TapiStruct.dwNumLines) == LINEERR_REINIT)
   {
       Sleep (5);
       if (MessageBox(hWnd, "Telephony system is reinitializing \
              - Click Cancel to abort", "Error",
              MB_RETRYCANCEL) ==IDCANCEL)
       {
           displayTapiErrorMessage(
               "User cancelled telephony initialization retry");
           return m_InstallOk=FALSE;
       }
   } // end while (TAPI reinitializing)

   if (m_TapiStruct.dwNumLines == 0)
   {
       displayTapiErrorMessage("No Modem Devices Installed");
       return m_InstallOk=FALSE;
   }
   return m_InstallOk=TRUE;
}