Вопрос № 159765: Здравствуйте, уважаемые эксперты. Возможно стоило задать вопрос по теме "теория программирования" но пишу сюда, так как программу пишу именно на Дельфи. Необходимо написать программу работы с СМС. Конкретнее - есть gsm модем, подключенны...
Вопрос № 159789: Доброго времени суток. Необходимо дождаться появления определенного окна чужой программы. Подскажите пожалуйста как лучше организовать ожидание чтобы не использовать
sleep и прочие извращения Вот код: <div style="margin:15px; margin-top...
Вопрос № 159.765
Здравствуйте, уважаемые эксперты. Возможно стоило задать вопрос по теме "теория программирования" но пишу сюда, так как программу пишу именно на Дельфи. Необходимо написать программу работы с СМС. Конкретнее - есть gsm модем, подключенный к сом порту, на который и с которого смс принимаются/отсылаются. Формат команд/ответов есть, т.е. с "верхним" уровнем проблем нет. Но, как известно, компонета "модем" нет ни в одной среде (что конечно вполне естественно). Раньше с подобными
задачами не сталкивался (профиль не тот), потому покопал в инете и выяснил, что необходимо писать модуль для работы с сом портом, что я уже сделал, но есть тонкости. Сейчас модуль написан для работы в синхронном режиме с отдельным потоком для чтения и событием, обработчик которого вызывается при получении байта, но и так загрузка процессора составляет 20-25% (опрос ведь также происходит в цикле). Есть функция SetCommMask, которая как нельзя лучше подходит, но она для асинх
ронного режима работы. Как здесь мне быть? Использовать эту функцию и работать в асинхронном режиме? (модем то любой работает в синхронном). Просто следить чтобы операции не "перекрывались". Или же есть какие то другие механизмы? Встретилась такая фраза: "Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует
эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом." Почитал я про то, что говорит автор слов, но понял - мне это не нужно, соединений я не создаю и т.п. Просто нужно иногда посылать в порт нужную команду, читать ответ и все... В остальном программа просто ждет прихода в порт строки (строка определенного формата посылается в порт модемо
м при приходе смс или входящем звонке)... Конечно я наверное заново изобретаю велосипед - есть множество готовых уже компонентов типа "Сом-порт", но не в моих принципах не знать как и что делает каждая строка кода, да и за стабильность работы программы как я в таком случае могу отвечать? Заранее огоромное СПАСИБО!!!
Отправлен: 06.02.2009, 14:07
Вопрос задал: Ленар М. (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Armad
Здравствуйте, Ленар М.! Вопрос обширен, поэтому, следующее верно - Возможно, стоило задать вопрос по теме "теория программирования" Cледующее так же верно - необходимо писать модуль для работы с сом портом Именно в эту сторону нужно смотреть - ...режиме с отдельным потоком... (добавлю - режимах) Абсолютно верное упоминание - Встретилась такая фраза: "Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и
протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом." А вот тут Вы не правы - мне это не нужно, соединений я не создаю и т.п. Просто нужно иногда посылать в порт нужную команду, читать ответ и все... Это лишь часть реализации работы с C
OM портом, однако для полноценной работы (что теряется за Вашим - я всего лишь делаю то-то и то-то... ) необходима наиболее полная реализация работы протокола. Вот это мне особенно по душе - Конечно я наверное заново изобретаю велосипед - есть множество готовых уже компонентов типа "Сом-порт", но не в моих принципах не знать как и что делает каждая строка кода, да и за стабильность работы программы как я в таком случае могу отвечать?
В этом случае не поленитесь изучить код открытых компонентов
для работы с COM портом. Тема весьма обширна, а Вы , насколько я понял хотите готового решения, причем себе же и противореча. В плане ответа на Ваш вопрос. В свое время я реализовывал похожую задачу по коммуникации рабочей станции и терминала с грузовыми весами, там тоже обмен данными шел весьма своеобразно и по COM порту. Так вот я воспользовался советами с http://www.delphimaster.ru/ и чтением примеров из DelphiWorld - http://delphiworld.narod.ru/ Поверьт
е мне, там есть ответы на Ваш вопрос. Стоит лишь внимательно прочитать. Если же у Вас все таки останутся вопросы, не стесняйтесь пишите мне на почту (не совсем уверен что могу оставить адрес, но думаю поправят, если не прав - на roobeeaz@rambler.ru (по моему исходники еще лежат где-то на HDD))
Ответ отправил: Armad (статус: 3-й класс)
Ответ отправлен: 06.02.2009, 15:50
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 243031 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 159.789
Доброго времени суток. Необходимо дождаться появления определенного окна чужой программы. Подскажите пожалуйста как лучше организовать ожидание чтобы не использовать sleep и прочие извращения
Вот код:
Код:
var Security_handle, Edit_handle, Button1_handle, Conn_info_handle, Success_handle
: HWND; ip, success:pchar;
begin ip:=pchar('Radmin security: '+Edit1.Text); success:=pchar(Edit1.Text+' - Telnet'); Security_handle := FindWindow (nil, ip); If Security_handle <> 0 then begin Edit_handle := FindWindowEx(Security_handle, 0, 'Edit', ''); SendMessage(Edit_handle, WM_SETTEXT, 0, Integer(PChar('password'))); Button1_handle := FindWindowEx(Security_handle, 0, 'Button
39;, 'OK'); SendMessage(Button1_handle, BM_CLICK, 0, 0);
Sleep(5000); //!!!!
Conn_info_handle:=FindWindow (nil, 'Connection info'); Success_handle:=FindWindow (nil, success); if (Conn_info_handle <> 0) and (Success_handle=0) then begin PostMessage(Conn_info_handle,WM_QUIT,0,0) end else begin ShowMessage('GoodPass');
Описание:
Собственно ищет имеется ли окно "Radmin security: + данные из Edit1", если найдено,
тогда передает сообщение в Edit этого окна и нажимает на кнопку. После нажатия на кнопку должно появиться окно с заголовком вида "Connection info", время от нажатия на кнопку до появления окна, естественно, каждый раз разное. Поэтому я всунул туда максимальный sleep который возможен, но хотелось бы этого избежать. Помогите примером, буду очень благодарен!
Отправлен: 06.02.2009, 19:25
Вопрос задал: Segey (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Mixala
Здравствуйте, Segey! Если я правильно понял, то необходимо после отсылки сообщения одному окну дождаться появления другого. Можно использовать просто цикл repeat Conn_info_handle:=FindWindow(nil,'Connection info'); until (conn_info_handle<>0); //если окно найдено, программа идет дальше, если нет, то ищет заново
это вместо sleep. Таким образом программа будет проверять нет ли нужного окна, а когда наконец оно появиться, пойдет дальше.
Ответ отправил: Mixala (статус: 4-й класс)
Ответ отправлен: 06.02.2009, 22:59
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 243067 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Скажите "спасибо" эксперту, который помог Вам!
Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
на короткий номер 1151 (Россия)
Номер ответа и конкретный текст СМС указан внизу каждого ответа.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.