Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Инициализация TAPI, открытие линии.


Автор: AndreySol 16.2.2007, 01:54
Нашел пример инициализации 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)
{
}

Помогите !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)