![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| PRO |
|
|||
|
Unregistered |
Программа (DOS/WIN) отсылает по COM-порту данные. Как в Delphi прочитать отсылаемые данные?
|
|||
|
||||
| Dayana |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 352 Регистрация: 6.10.2002 Где: Тель-Авив Репутация: 2 Всего: 4 |
Есть среди компонетов APRO компонент TApdComPort, который работает с COM портом...
Это сообщение отредактировал(а) Dayana - 4.2.2003, 02:22 |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
MSDN - он вообще помогает
The "CreateFile" function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O. For more information about communications, see Communications. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
А почему бы не попробовать в наш FAQ заглянуть:
http://www.forum.vingrad.ru/index.php?act=...=ST&f=32&t=1950 -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Топик в FAQ . Не понятно, зачем автор использует структуру OVERLAPPED при чтении данных (ReadFile). Ведь порт он открывает как FILE_ATTRIBUTE_NORMAL. Кроме того эта структура используется, как я понял из ее описания, используется при параллельной работе с файловым вводом/выводом и указатель на нее должен присутствовать в ReadFile, WriteFile и WaitCommEvent. Последняя функция, ждет события ком-порта и если нет указателя на OVERLAPPED, то она просто не возвращает значения пока событие не произойдет. Если указатель присутствует, то функция возвращает какое-то значение и далее уже нужно манипулировать с указателем на событие.
|
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Недавно возился с одной прогой ("PROWIN"). Это 16-ти битное приложение для win, которое послылает/принимает данные через модемы и т.д. Мне хотелось посмотреть, что и как она отсылает/получает в COM-порт: струтуру протокола и т.п.
Исследование показало, что такие (16-ти битные) приложения юзают различные апи системной библиотеки user.exe (OpenComm, ReadComm .. etc). user.exe в свою очередь является затычкой и транслирует такие вызовы в драйвер VCOMM.vxd (речь идет о win9x). Таким образом, чтобы исследовать работу этой программы с com-портом (подразумевается, что нет исходного текста), существуют как минимум 2 способа: - Перехват и мониторирование апи user.exe; - Перехват и мониторирование апи VCOMM; В отладчике, разумеется, можно ставить бряки куда угодно но в реальной работе такие паузы недопустимы: нужно было написать именно логгер этих апи. Как мне показалось, лучшим решением является именно перехват апи VCOMM, поскольку по мощности (уровню детализации) апи драйвера чуть ли не один в один повторяют апи user.exe и, самое главное, есть стандартный виндовый механизм перехвата апи любого драйвера из другого драйвера. Реализация заключалась в написании довольно простого vxd, перехватывающего апи VCOMM и по запросу win32 приложения (DeviceIOControl из kernel32.dll) отдающего результат мониторинга (вызов с такими-то параметрами, результат такой-то). Если кому-то будет интересно, могу поделиться исходниками и комментраиями. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Очень интересно. ) Поделись. Может в FAQ закинешь? На всякий случай: [email protected]
|
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Что значит - в FAQ ?
Могу положить прямо сюда код драйвера, скомпиленный драйвер и пример кода, его юзающего. Могу положить в свой каталог и дать ссылку. На всякий случай: http://chingachguk.newmail.ru/Hookvcom.arj Там несколько файлов. hook.ASM - текст драйвера vxd; hook_vxd.asm - пример загрузки драйвера и запросов к нему; HOOK.VXD - сам драйвер; hook_vxd.exe - код загрузчика; hook_VCOMM01.log - Пример лог-файла программы слежения. Как это работает ? - Сначала hook_vxd загружает через DeviceIOControl драйвер; - Далее она вызывает его функцию HookProc - перхватить функции драйвера VCOMM: перехватываются вызовы OpenComm, ReadComm, WriteComm и CloseComm; - После этого я открываю тред, в котором опять через DeviceIOControl опрашиваю драйвер функцией GetFirstDebugInfo - получить отладочную информацию от драйвера. Поскольку работа асинхронная, драйвер копит отладку в своем кольцевом буфере и выдает из него пакет за пакетом вызвающему его win32-приложению. Не лучшее решение ж) - Если MessageBox опрашивающей программы закрывается, то она выгружает драйвер, отдав ему команду UnHookProc - осовбодить перехваченные функции. Пример работы: Date:06.02.03 Time:12:54:47:OpenComm:COM1 Result:EAX:c17fc574 Date:06.02.03 Time:12:54:55:CloseComm:port:c17fc574 Result:EAX:c17fc575 Result:EAX:00000002 В первой строке видно, что был вызов OpenComm'а. Переданный аргумент (имя порта) был COM1, VCOMM порт открыл и вернул его хэндл (EAX:c17fc574). Вторая строка: Был вызов CloseComm'а. Передался хэндл ранее открытого порта (port:c17fc574), результат работы функции был:EAX:00000002. Примерно так ;) Это сообщение отредактировал(а) Chingachguk - 6.2.2003, 21:13 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Да, и еще.
Не все приложения, работающие с COM-портами, можно мониторить под win9x таким драйвером, но многие (те, которые в конце концов используют драйвер VCOMM). Вот еще посмотрел одно приложение (написано на Дельфи, загрузчик терминала, подключенного к com-порту):
Терминал не был готов принять данные, поэтому видно, как приложение каким-то образом пытается установить соединение, отправляя байт 05h в порт с интервалом в 5 сек. У драйвера VCOMM существуют и другие фунции, например:
Но я пока мониторю только 4. Остальные, видимо, предназначены для настройки порта и т.п (см. MSDN). -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| PRO |
|
|||
|
Unregistered |
Спасибо всем за ответы! Да хорошие дали ответы (особенно Chingachguk и Dapo) спасибо! Но я еще хотел бы уточнить ситуацию: итак на компе стоит прога (читать - много разных прог), отсылающая по COM порту данные;требуется: с этого же компа вести мониторинг COM портов и что самое главное: чтение данных, которые отправляет прога (например прога отправляет по COM1 данные, моя прога на том же компе считывает данные с COM1, которые отсылает прога другому компу...). Фух! Прошу прощения за мутную трактовку, но я думаю всем все понятно. С нетерпением жду Вашего ответа...
|
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
to PRO: вроде моя прога (точнее, драйвер+прога как раз это и делает), причем не для одной конкретной проги, а для всех, кто общается с COM-портами через VCOMM. Если будешь пользовать, то единственное, что буфер записи у меня маловат и для больших пакетов не подходит. Если что, могу переделать.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| PRO |
|
|||
|
Unregistered |
to Chingachguk: Спасибо за помощь! Я скачал твой архив. Правда почему - то в процесе работы прога намертво вешает комп, но главное - я понял что и как. Спасибо! Но теперь меня еще больше волнует вопрос: как быть с такой прогой, если она под ДОС и работает в Окнах
|
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Исправлено: http://chingachguk.newmail.ru/Hook_vxd.arj (Там было переполнение кадра кольцевого буфера). Сделал 50 кадров в буфере, размер кадра отладки сделал 2000h и добавил контроль на границы. Теперь виснуть не должно. Если про дос, то можно перехватить int 21h функцию "open file" (3dh), запомнить дескриптор открытого "файла" и смотреть уже функции чтения-записи (3fh/40h) аналогично. Правда, если она это делает напрямую (через порты ввода-вывода), то этот способ не пройдет ... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| PRO |
|
|||
|
Unregistered |
to:Chingachguk Скачал твой новый архив... но увы извени... хороших новостей нет - он тоже веси всю систему намертво (на том же месте). Да, а с ДОС ом я вижу ничего не выйдет, да
|
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Млин... А как вешает ? У тебя же 98-95 ? Запускать надо просто exe,vxd должно быть под ногами. Мессадж боксы успевает показать ? А если не запускать проги, работающей с ком-портом (те мониторить вхолостую), то он нормально (монитор) завершается ?
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |