![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Cetus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: нет Всего: 1 |
как сделать чтобы при входящем звонке запускалась какая либо процедура?
--------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
unreg |
|
|||
Unregistered |
Надо отследить этот самый входящий звонок.
Есть два пути по которым ты можешь это сделать: 1. использовать TAPI (самому вызывать функции или компоненты Turbo APRO) 2. работать с портом напрямую. Недостаток 1-го пункта в том, что TAPI подходит далеко не для каждого модема. Я с этим столкнулся. Зато если поддерживает, то работает на ура. Например, Acorp на Rockwell работать через TAPI не захотел, а вот Acorp на Conexant - никаких проблем. Недостаток 2-го пункта: надо знать протокол обмена модема с компьютером (разные модемы - разные протоколы, особенно если это касается голосовых функций) + сложность реализации обработки звуковых потоков. Если тебе не нужно работать с голосом, то я бы посоветовал 2-й вариант. Примеров работы с портом много. При входящем звонке модем выдает в порт строку RING (на каждый сигнал). Делай прослушку порта (WaitCommEvent по RX_CHAR) и отслеживай их, а дальше - вызывай свою процедуру. PS Можно сделать еще интереснее. Модем умеет переводить (мой, после небольшой настройки) посланный абонентом тоновый сигнал в символ соответствующий нажатой кнопке - полет фантазии практически не ограничен. ![]() |
|||
|
||||
Cetus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: нет Всего: 1 |
нашел в API, WaitCommEvent, впринципе как решение подходит если опрашивать порт через определенное время
--------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
unreg |
|
|||
Unregistered |
что значит опрашивать через определенное время? Открываешь порт к которому подключен модем и по WaitCommEvent ждешь пока какой-нибудь символ придет в приемный буфер. А раз символ пришел - значит можно читать с порта (там что-то есть). Так почти все проги построены. Можно, конечно, в TCOMMTIMEOUTS сделать ReadIntervalTimeout:=MAXDWORD. тогда функция ReadFile будет возвращать значение сразу же, не завсисмо от того есть в буфере что-то или нет (кстати, альтернатива для тех кто не хочет заморачиваться с асинхронным вызовом). Т.е. открыл порт и на таймер повесил ReadFile. На этом, если память не изменяет, построен компонент TCommPort32.
|
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Если делать WaitCommEvent, это заблокирует модем для всех приложений. Это не всегда бывает полезно.
Поэтому лучше через определённые интервалы времени открывать COM-порт, проверять состояние RING и закрывать порт... (или может можно открыть порт как-то, чтобы другие могли его юзать ?) А если делать WaitCommEvent, то зачем смотреть символы ? Ждать EV_RING чем хуже ? (я этим не занимался, просто спрашиваю ради интереса) -------------------- С уважением, г-н Посол. |
|||
|
||||
unreg |
|
||||
Unregistered |
Да согласен, конечно. Только придется синхронизировать работу этих самых приложений. Если идти этим путем, то я бы, наверное, в одной проге создавал дочерние процессы (вплоть до реализации плагинов). Т.е. все-таки, занимал бы порт одним процессом, а дальше - рулил по ситуации. Что будет, например, если обоим прогам нужен этот самый RING и обоим надо снять трубку?
Конечно, и здесь все верно. ![]() ![]() |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
А ведь порт можно открывать только для чтения
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Уточняющий вопрос:
Входящий звонок - это установка TCP соединения? Или достаточно самого факта звонка, а соединение устанавливать не нужно? Если соединение не нужно, то просто садимся на порт, говорим модему, что ждем звонка и сидим, ждем. Как прошел коннект, выполняем и отрубаем. Если соединение нужно... Когда-то... Был у меня диалап сервер. И в инете валялся классный RAS Server. Вел он и статистику, и айпишники раздавал грамотно, и лимиты вел. Кроме всего запускал он у меня при прозвоне программку, которая нужную мне инфу писала. Но как его найти, даже не подскажу. Помню, что RAS Server, работает сервисом. По-моему другого названия у него и нет... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |