Нашел пример инициализации TAPI, открытия линии.
| Код | HLINEAPP hLineApp = NULL; HLINE hLine = NULL; HANDLE hTapiEvent = NULL; DWORD dwNumDevs = 0; DWORD dwTapiMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE; DWORD dwTapiDeviceID = -1;
DWORD dwAPIVersion = TAPI_CURRENT_VERSION;
LINEINITIALIZEEXPARAMS lpLineInitExParam = {0}; lpLineInitExParam.dwTotalSize = sizeof(LINEINITIALIZEEXPARAMS); lpLineInitExParam.dwOptions = LINEINITIALIZEEXOPTION_USEHIDDENWINDOW;
lResult = lineInitializeEx(&hLineApp, NULL, (LINECALLBACK)LineCallbackFunc, NULL, &dwNumDevs,
&dwAPIVersion, &lpLineInitExParam); if(lResult != 0) return lResult; else { // Event handle hTapiEvent = lpLineInitExParam.Handles.hEvent;
for(unsigned long l = 0; l < dwNumDevs; l++) { LINEEXTENSIONID LineExtensionID = {0}; DWORD dwNegotiatedTapiVersion;
// Skip devices incompatible to our version if((lResult = lineNegotiateAPIVersion(hLineApp, l, dwAPIVersion, dwAPIVersion,
&dwNegotiatedTapiVersion, &LineExtensionID)) < 0) continue;
lpLineCaps.dwTotalSize = sizeof(LINEDEVCAPS); lResult = lineGetDevCaps(hLineApp, l, dwNegotiatedTapiVersion, 0, &lpLineCaps); if(lResult != 0) return lResult; else { DWORD dwNeeded = lpLineCaps.dwNeededSize; ZeroMemory(&lpLineCaps, sizeof(lpLineCaps)); lpLineCaps.dwTotalSize = dwNeeded; lResult = lineGetDevCaps(hLineApp, l, dwNegotiatedTapiVersion, 0,
&lpLineCaps); if(lResult == 0) { if(lpLineCaps.dwMediaModes & dwTapiMediaMode) { dwTapiDeviceID = l; break; } } } }
lResult = lineOpen(hLineApp, dwTapiDeviceID, &hLine, dwAPIVersion, NULL, (DWORD_PTR)
LineCallbackFunc, LINECALLPRIVILEGE_NONE, LINEMEDIAMODE_INTERACTIVEVOICE, NULL); if(lResult < 0) { MessageBox("Error lineOpen","",0);
return lResult; } }
|
Куча непоняток: 1. Если код оставить в приведенном выше виде, то определяется одна линия и lineOpen срабатывает без ошибки. Если объявление переменной DWORD dwAPIVersion вынести в хедер, а в реализации оставить
| Код | dwAPIVersion = TAPI_CURRENT_VERSION;
|
то ни одной линии не определяется и lineOpen дает ошибку. В чем дело ?
2. Когда линия определяется, то ее название, которое можно получить из LINEDEVCAPS - "IPCONF LINE". Если для этой линии сделать lineMakeCall, то ошибки нет но модем молчит намертво.
3. Заставить модем набрать номер получается только если вместо dwTapiDeviceID в lineOpen подставить 0. Этому идентификатору соответствует линия "Минипорт WAN(L2TP)", но она почему-то не определяется в этом месте
| Код | if(lpLineCaps.dwMediaModes & dwTapiMediaMode) { }
|
Помогите !!! |