Re[4]: TAPI и COM-порт
От: Аноним  
Дата: 06.07.04 10:24
Оценка:
Здравствуйте, 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;

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.