Здравствуйте, vkilikov, Вы писали:
V>Привет ! V>Я пытаюсь написать программу для обмена данными посредством модема. Для работы с модемом (дозвон, соединение, контроль состояния линии и т.п.) хочу использовать TAPI, а для пересылки и получения данных — стандартную работу через COM-порт с посощью WriteFile/ReadFile. Если я сначала соединяюсь с помощью TAPI, а потом пытаюсь создать файл посредством CreateFile, то получаю ошибку "The process cannot access the file because it is being used by another process". Если пытаюсь сначала создать файл, а потом соединяться с помощью TAPI то вылетаю на lineOpen с загадочной ошибкой LINEERR_OPERATIONFAILED. V>Можно ли в принципе работать одновременно с TAPI и COM-портом через файл ? Если нет, то как сделать ?
Работать и с тем и с другим в принципе возможно , но с большими ограничениями...
1) C помощью ф-ций TAPI (lineInitializeEx , lineOpen ) мы открваем модемную линию и можем работать с ней , используя ф-ции TAPI .
НО !!!!!!!!!!!!!!!!! в этот момент мы не можем получить доступ к COM порту и не можем получить его хэндл, на котором висит модем , используя ф-цию CreateFile . Так как в этот момент COM порт занимается TSP драйвером модема
(пердположим "Zyxel Omni")
Что нам , по этому поводу говорит МСДН .
В Windows TAPI существуют несколько типов устройсв , один из них — "comm/datamodem" — которым и является наша отрытая TAPI линия. Так вот !!! , в принципе , есть возможность , через TAPI , получить хэндл КОМ порта.
Делается это с помощью lineGetID функции — в первых 4х битах пятого параметра (LPVARSTRING lpDeviceID) как раз и содержится хэндл порта ....
------------------------------
comm/datamodem
The comm/datamodem device class consists of datamodem devices. You access these devices by using the Win32 file and communications functions. Devices in this class are associated with line devices that support the LINEMEDIAMODE_DATAMODEM media type, which is specified in the dwMediaModes member of the LINEDEVCAPS structure for the line device.
The lineGetID function fills a VARSTRING structure, setting dwStringFormat to the STRINGFORMAT_BINARY value and appending these additional members:
HANDLE hComm; // Win32 file handle to data modem
CHAR szDeviceName[1]; // name of data modem
The hComm member is the handle of the open communications port. This member is NULL if the port is not yet open or if the dwSelect parameter of lineGetID is not the LINECALLSELECT_CALL value.
---------------------------------
А вот здесь то и начинаются ограничения — полученый хэндл активен только , если TAPI линия модема (точнее звонок на этой линии) находится в состоянии соединения LINECALLSELECT_CALL... — вот и как обойти этого ограничения TAPI я так и не разобрался ........