Здравствуйте, Sergeant, Вы писали:
А>>Не надо переводить модем в режим LINEBEARERMODE_PASSTHROUGH. Просто lineGetID надо вызывать после того, как линия перешла в состояние LINECALLSTATE_CONNECTED. И главное, полученный HANDLE СОМ-порта открыт в режиме OVERLAPPED.
S>Не согласен. Если не переводить линию в режим LINEBEARERMODE_PASSTHROUGH, WriteFile или ReadFile возвращают ERROR_INVALID_HANDLE.
Странно. У меня работает. Вот куски кода
LPVARSTRING DeviceID;
struct CommInfo
{
HANDLE hComm; // handle of open comm. device
CHAR szDeviceName[1]; // name of comm. device
} *comminfo;
...
case LINECALLSTATE_CONNECTED:
DeviceID=(LPVARSTRING)ReallocBuff(sizeof(LPVARSTRING));
do
{
lineGetID(NULL, 0, (HCALL)(TapiMsg.hDevice), LINECALLSELECT_CALL, DeviceID, "comm/datamodem");
if(DeviceID->dwTotalSize>=DeviceID->dwNeededSize)break;
DeviceID=(LPVARSTRING)ReallocBuff(DeviceID->dwNeededSize);
}while (true);
comminfo=(CommInfo*)((char*)DeviceID+DeviceID->dwStringOffset);
...
int __stdcall CommRead(HANDLE hComm, char *Buff, DWORD BuffSize, DWORD timeout)
{
if(GetFileType(hComm)!=FILE_TYPE_CHAR)return -2;
DWORD dwReaded;
OVERLAPPED Overlapped={0,0,0,0,0};
Overlapped.hEvent=CreateEvent(NULL, true, false, NULL);
try
{
if(!ReadFile(hComm, Buff, BuffSize, &dwReaded, &Overlapped))
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(Overlapped.hEvent, timeout);
if(!GetOverlappedResult(hComm, &Overlapped, &dwReaded, false))CancelIo(hComm);
}
else dwReaded=-1;
}
}
catch(...)
{
dwReaded=-3;
}
CloseHandle(Overlapped.hEvent);
return dwReaded;
}