Figure 2: Version negotiation
int CRemoteConnect::telephonyInitialize(HWND hWnd, HINSTANCE hInst) { LONG lrc; int i; LINEEXTENSIONID extensions; // record telephony initialization as commenced m_TapiStruct.bInitialized = TRUE; // record every logical line for those that support modem data for (i=0; (unsigned)i<m_TapiStruct.dwNumLines; i++) { // negotiate version of TAPI to use lrc = lineNegotiateAPIVersion(m_TapiStruct.hTAPI, i, WIN95TAPIVERSION, WIN95TAPIVERSION, &m_TapiStruct.dwVersionToUse, &extensions); if (lrc) continue; // record the device to be interrogated m_TapiStruct.dwLine = i; // get line device caps - on error, // terminate initialization lrc = mylineGetDevCaps(); if (lrc) return lrc; // add this Modem to version compatibility list if it // supports data transfers -- get Modem name and Icon for // subsequent user display and selection if (m_TapiStruct.pLinedevcaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM) getModemNameandIcon(i); } // endfor // <remainder of function not shown for brevity> }