![]() |
Отключение модема (softmodem) от порта.
Вобщем такова суть. Нужно отключать модем от линии сразу. Как только я нажал на кнопку отключиться, он должен резко вырубаться.
А в WinXP очень много проблем с ретрейнами. Иногда бывает, что в момент ретрейна надо отключиться, а он гад ждет, пока весь ретрейн закончится и только потом отключается. В 98 такой фигни нету. Там нажал отключиться и он сразу отключает модем от линии. Есть ли такая... ...даже не знаю... фигулька или программулька для XP, чтобы модем отключался сразу. Может можно самому состряпать такую вещь, которая отключала порт (COM) или ещё как-нибудь. тока не говорите отключать железно от линии, типа реле или ещё как-нить. надо что-то программное Подскажите плиз. а то у меня стоит 2 оси (XP/98) из-за этой хрени с диалапом. ps не спрашивайте зачем. просто очень надо. спасибо заранее. pps не знал куда все это засунуть. всмысле в какой раздел. если что, перенесите. |
Вот я щас почитал. Другой вопрос. Как отучить модем от ретрейнов. Почему в 98ом нет ретрейнов, а в XP почти на каждом коннекте.
modem ACORP M-56IRW |
под 9х работает,под ХР - надо пробывать....
procedure TForm1.Button1Click(Sender: TObject); Var COM2:TextFile; begin AssignFile(com2,'COM2'); // 'COM2' - порт на котором висит модем Rewrite(Com2); // открываем порт на запись Close(com2); // освобождаем порт end; _________ сразу говорю,это некрасиво,но работает :) |
ну или чуть правильнее :)
TerminateThread(CommThread,0); //- "убиение" параллельного потока приема CloseHandle(CommHandle); //- "убиение" собственно файла-порта. |
Цитата:
у меня модем подключен, а когда я хочу сделать assign, пишет i/o error. вот с terminatehandle как сделать. я так понял, что во время работы модема terminatehandle отключает его каким-то фигом. |
ну раз не шаришь - вот готовый юнит:
unit PortUnit; interface uses windows,sysutils; var CommHandle : integer; DCB : TDCB; Ovr : TOverlapped; Stat : TComStat; CommThread : THandle; hEvent : THandle; Flag,StopResive : boolean; KolByte,Kols,Mask,TransMask,Errs : DWord; procedure PortInit; procedure ReadComm; procedure WriteComm(A:byte); procedure KillComm; implementation uses Main; procedure KillComm; begin TerminateThread(CommThread,0); CloseHandle(CommHandle); end; procedure WriteComm(A:byte); var Transmit:array [0..255] of char; begin //послать один символ в порт KolByte:=1; Transmit[0]:=chr(A); WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr); end; procedure ReadComm; var Resive:array [0..255] of char; begin while true do begin TransMask:=0; WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие begin ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг Kols := Stat.cbInQue; ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем //тут должна идти обработка принятой информации из Resive Form1.Panel1.Caption:=string(Resive); //не очень хороший вариант вывода, но для примера подойдет end;//mask end;//while end; procedure PortInit; var ThreadID:dword; begin //создание и иницализация порта KolByte:=0; //создание порта и получение его хэндла CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0); //ставим маску - "по пришествии определенного символа" SetCommMask(CommHandle,EV_RXFLAG); //построение DCB GetCommState(CommHandle,DCB); DCB.BaudRate:=CBR_9600; DCB.Parity:=NOPARITY; DCB.ByteSize:=8; DCB.StopBits:=OneStopBit; DCB.EvtChar:=chr(13);//задание символа для флага //устанавливаем DCB SetCommState(CommHandle,DCB); //создаем паралельный поток //там будет вертеться процедура приема строки //с порта - ReadComm CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID); end; end. |
не посчитай меня за тормоза, но что с этим делать ?????
у меня порт открыт и мне нужно узнать хэндл этого открытого порта. как мне его узнать. procedure KillComm; begin TerminateThread(CommThread,0); CloseHandle(CommHandle); end; убить поток. а какой поток именно ?? я все равно не понял. //создание порта и получение его хэндла CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0); порт у меня уже создан и на нем работает модем. я же не могу параллельно к нему подключиться. вобщем ещё раз ситуевина. работает подем, значит порт открыт (com3) мне надо обрубить этот порт во время работы. вроде все. |
хм.....
InternetAutodialHangup Отсоединяет модем от линии. InternetAutodialHangup( dwReserved:Cardinal ):BOOLEAN; Параметры dwReserved Зарезервировано. Должно быть 0. Возвращает TRUE при успешном результате, FALSE в противном случае. больше инфо в мсдн,но я думаю этого должно хватить :) |
donatas
это обычное отключение от сети. так не пойдет. получается, что во время работы нельзя отключить модем. так ? |
пошли в него(в модем) в концеконцов ATH :) - должен трубу сразу бросить :)
|
а как я пошлю, если порт открыт ras'ом.
|
| Часовой пояс GMT +4, время: 16:30. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.