Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2010, 18:30
burda_a_m burda_a_m вне форума
Прохожий
 
Регистрация: 23.12.2010
Сообщения: 1
Репутация: 10
Вопрос Вопросы о TAPI и dialer.exe: об их взаимодействии

Всем привет!

Для одного человека хотел написать программу. У этой программы помимо других функций должны быть реализованы функции для работы с телефонией. По началу я написал пробную программу для набора номера. Сделал это я через открытие СОМ-порта и записи в него ATD-команд. Вот код процедуры набора номера:

Код:
procedure upmodem;
var
  PhoneCommand: string;
  CommPort: string;
  NumberWritten: cardinal;
begin
  PhoneCommand := 'atdt' + FrmCall.TxtNumber.Text + #13 + #10; //Поднять трубку и набрать номер
  CommPort := 'COM'+IntToStr(FrmCall.CmbCOMPort.ItemIndex+1);//Ваш СОМ порт

  //-------------------Открыть порт как файл

  hCommFile := CreateFile(
    PChar(CommPort),
    generic_read or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);                     {}
  if hCommFile = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Не могу открыть порт ' + CommPort);
    exit;
  end;

  //-------------Выполнить команду по средству записи в файл

  NumberWritten := 0;
  if WriteFile(hCommFile,
    PChar(PhoneCommand)^,
    Length(PhoneCommand),
    NumberWritten,
    nil) = false then
  begin
    ShowMessage('Не могу произвести запись в порт ' + CommPort);
  end;{}
end;

Здесь TxtNumber.Text – текстовое поле, в которое вводится номер телефона, CmbCOMPort – раскрывающийся список (TComboBox) с вариантами СОМ-портов. У меня и других моих знакомых этот код работает, а вот у человека, для которого я и хочу написать программу, вылазит сообщение "Не могу произвести запись в порт". При этом должен заметить, что человек пользуется Виндовским диалером (dialer.exe). Кстати, у человека ноутбук ACER ASPIRE 7738G. В нем встроенный модем (LSI HDA modem-56K ITU V.90 чип-SV92A3). Так вот, Виндовский диалер у него работает, набирает номер и реагирует на входящие звонки, определяя номер вызываемого абонента. Операционка у него стоит Windows 7 Home.

И так. Раз вышеуказанный код не может произвести запись в порт, значит порт на запись занят. Но при этом Виндовская утилита dialer.exe у него работает. Тогда я начал копать в сторону TAPI. В Интернете нашел это материал http://mostinfo.net/article/9/46.htm и на его основе написал пробный вариант программы набора номера. У меня и этот вариант работал на ура. Но вот человек, для которого я и хотел написать программу, говорит, что у него и он не работает. Тогда я попросил своих друзей, у которых стоит Семерка, протестировать этот вариант. У троих из трех этот вариант работал.

Человек постоянно мне твердит, что у него модем какой-то особенный. У него "встроенный модем (LSI HDA modem-56K ITU V.90 чип-SV92A3),позволяет работать находясь в сети(вкл.браузер)и одновременно звонит". Но я не понимаю, в чем его уникальность с точки зрения программирования. Я далеко не гуру и в области программирования, но имею некоторые соображения относительно TAPI. Однако не знаю, верны ли они. Пожалуйста, знающие люди, если следующие мои рассуждения будут не верны, поправьте меня.

Первое - реализация в Delphi 7 функций телефонии через TAPI связана с утилитой dialer.exe. Ведь когда я запустил свой пробный вариант на основе TAPI и дал команду набрать номер, то Windows сама запустила утилиту dialer.exe, и та уже осуществляла набор номера. Следовательно, я сделал такой вывод. Функции телефонии, реализованные через TAPI, взаимодействуют с утилитой dialer.exe. То есть, если утилита dialer.exe работает корректно (набирает номер), то и моя программа должна набирать номер. И это никак не зависит, какой модем у человека. Второе, если у человека при попытке набора номера из моей программы ничего не происходит (то есть компьютер никак не реагирует на команды, которые дает программа через TAPI), значит проблема у него в операционной системе. Возможно, отключена какая-то служба, которая и позволяет осуществлять связь сторонних программ с виндовской телефонией. Еще, я полагаю, что здесь дело не в самом модеме. Модем, его марка и тип, тут не причем.

Пожалуйста, если сделанные мной выводы не верны, поправьте меня. Если указанный модем какой-то особенный, поясните, в чем его особенность. Неужто с ним нельзя работать так, как с другими модемами? Добавлю еще, что VentaFax у него ранее работал корректно. Сейчас он этой программой не пользуется.

Прикрепляю к посту архив с двумя моими пробными проектами на тот случай, если их кто-то захочет посмотреть.
Вложения
Тип файла: rar projects.rar (16.8 Кбайт, 20 просмотров)

Последний раз редактировалось burda_a_m, 23.12.2010 в 18:37.
Ответить с цитированием
  #2  
Старый 23.12.2010, 19:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
При этом должен заметить, что человек пользуется Виндовским диалером (dialer.exe). Кстати, у человека ноутбук ACER ASPIRE 7738G. В нем встроенный модем (LSI HDA modem-56K ITU V.90 чип-SV92A3). Так вот, Виндовский диалер у него работает, набирает номер и реагирует на входящие звонки, определяя номер вызываемого абонента. Операционка у него стоит Windows 7 Home.
Первая же возможная причина указана в твоем посте: встроенный модем. Вторая - Windows 7.
Вообще довольно многие девайсы сейчас работают через ВИРТУАЛЬНЫЙ ком-порт, т.е. стоит схемка FTDI которая прикидывается ком-портом, и подключается через USB. Но вот беда: некоторые проги с этим не пашут. Еще сильнее проблема обостряется при использовании Win7. Как исправлять - не знаю, пусть попробует через виртуальную машину с WinXP, там чуть больше вероятность запуска, хотя тоже отнюдь не 100% результат.

Я например купил программатор для USB, и 4 дня мучался, прежде чем смог его запустить на своем ноуте. И то не всё работает, и периодически слетает.

Можешь попробовать поиграться с параметрами файла при открытии. Очень многие юзают FILE_FLAG_OVERLAPPED вместо NORMAL
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 23.12.2010 в 19:09.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:58.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025