| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Открыть одно приложение делфи через другое |
| Автор: pavelv 21.4.2008, 11:40 |
| Есть приложение делфи. Через него когда введут адрес, нужно открыть окно другого приложения. Оба кода могу редактировать. Пока не понимаю возможно ли это сделать не прибегаю к помощи лишних txt файлов или реестра? Из вариантов допустим после запуска второго приложения, там открывается параллельный поток и что-то анализирует...постоянно его запускать, видимо только так? Допустим нужно анализировать, что запущено первое приложение. Дальше как считать данные из окна первого приложения...а как считать данные из окна первого приложения? А может проще из первого приложения обратиться ко второму приложению и передать ему данные? Какие есть для этого функции? P.S> Не хватает знаний, заранее спасибо. |
| Автор: Wolfgan 21.4.2008, 12:53 |
| Для запуска другого процесса можно использовать CreateProccess или ShellExecute Для обмена можно использовать технологию DDE или как вариант работать по TCP/IP. Использовать CreateProcess - предпочтительней. Т.к. таким образом легче управлять запущенным дочерним процессом. Например можно отследить когда оно закроется или например подчинить себе и много других фичей. Вариант обмена по DDE уже как бы староват, да и по TCP/IP - можно и по сети рулить. Тут не так сложно. Можно заложить в обе программы набор команд. Т.е. при подачи команды с клиента на сервер, на сервере выполняются какието действия после чего результат возвращается клиенту. В общем солжно написать не большой протокол обмена (надстройкой над TCP/IP) между приложениями. Но это все мытарства. Почитай про технологию COM, DCOM. Там это уже все встроено |
| Автор: SlaUr 21.4.2008, 21:26 | ||
насколько я знаю они передают только цифровые значения или не только? т.Е.Строку допустим через них передать нельзя или я не прав? |
| Автор: saneea 21.4.2008, 22:41 |
| Есть ещё такая вещь как "файл отображаемый в память". Это очень мощное "оружие", т.к. с помощью него любое количество программ могут работать с одной областью памяти через указатель. Вот прикрепляю файл с моей лабораторной работой (а точнее с двумя: в одной передаются числа, а в другой строки(пример одностороннего чата)) и фрагментом методички. |
| Автор: THandle 22.4.2008, 08:42 | ||||
Это почему же? Да вот хотя бы есть какое-то наше приложение с формой класса TForm1 и находящемся на ней Edit'ом. Пересылаем в него текст. Всё отлично работает и со строками.
|
| Автор: pavelv 24.4.2008, 07:57 |
| Всем спасибо, с FindMessage и PostMessage пока способ прозрачнее поэтому по нему и пошёл. Единственно FindWindow('TForm1', nil), а нужно FindWindow('TForm1', ''). Но пока не понимаю как передать инфу не во ВСЕ TEdit, а именно в конкретный по заданному названию? Возможно вообще такое? P.S> sanea идея неплохая, но тут думаю достаточно обойтись чем-нибудь потривиальнее. Добавлено через 6 минут и 36 секунд Пока писал понял, что ещё кое-что интересно. Таким способом передать данные в переменную нереально? Тоесть работа ведется только с компонентами? |
| Автор: SlaUr 24.4.2008, 08:14 | ||
Присоеденяюсь к вопросу .Очень интересно. Я думаю что в переменную не занести. |
| Автор: THandle 24.4.2008, 08:31 |
Нет. Послать или отправить сообщение можно только оконному компоненту. |
| Автор: Poseidon 24.4.2008, 08:54 | ||||
| Все реально. Вот пример как будем передавать integer. В "посылающей" программе:
в "принимающей":
|
| Автор: Poseidon 24.4.2008, 09:04 |
| Не совсем ясно что значит "на прямую"? Можно переменную сделать глобальной, тогда и использовать сможем ее везде. Или имеется ввиду как делает ArtMoney, менять значение прямо в памяти? |
| Автор: pavelv 24.4.2008, 11:25 |
| Poseidon спасибо - всё клёво, целое передаёт. Как передать строку додумать не могу, в типе TMessage нету строковых. Есть такая возможность? Один вопрос остался в воздухе, можно ли при передачи по компоненту передать конкретному TEdit с именем EditX(к примеру). Или он всегда будет передавать последнему? P.S> Может есть какой-нибудь фак в инете по этому поводу, а то неудобно спрашивать каждую строчку. |
| Автор: THandle 24.4.2008, 11:32 | ||||||
| pavelv, да точно также. Просто при передаче приводишь строчку к WParam, а при приеме обратно в строку. Вот как нибудь так: Передаём:
Принимаем:
|
| Автор: pavelv 24.4.2008, 11:44 |
| Принимающая программа в этом случае получает не те данные - каракули в общем |
| Автор: Poseidon 24.4.2008, 16:21 | ||||||
Добавлено через 4 минуты и 37 секунд
|
| Автор: pavelv 25.4.2008, 07:52 | ||||
| Пробовал на Delphi5, затем на Delphi7 ситуация одна. Код отправителя:
Код получателя:
Но есть одна особенность. Если при отправке взять вот эти данные: IntToStr(WParam(msg)) -- понятно будут какие-то цифры, и сделать в отправителе Pchar(IntToStr(WParam(msg))), то получим строку для отправки. Если в получателе взять IntToStr(Msg.WParam) то получаются теже цифры, то при переводе в буквы уже загагулины вылазят. Похоже на косяки с кодировкой, но слабо понимаю как так в одном приложении всё пучком, а в другом нет. |
| Автор: Poseidon 25.4.2008, 08:36 |
| Я же тебе выше написал как прямо в Edit отправлять текст... |
| Автор: pavelv 25.4.2008, 13:14 |
| Это всё понял, спасибо |