Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть одно приложение делфи через другое, без посторонних файлов и реестра 
:(
    Опции темы
pavelv
Дата 21.4.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Есть приложение делфи. Через него когда введут адрес, нужно открыть окно другого приложения. Оба кода могу редактировать. Пока не понимаю возможно ли это сделать не прибегаю к помощи лишних txt файлов или реестра?  
 Из вариантов допустим после запуска второго приложения, там открывается параллельный поток и что-то анализирует...постоянно его запускать, видимо только так? Допустим нужно анализировать, что запущено первое приложение. Дальше как считать данные из окна первого приложения...а как считать данные из окна первого приложения? 
 А может проще из первого приложения обратиться ко второму приложению и передать ему данные? Какие есть для этого функции?

P.S> Не хватает знаний, заранее спасибо.
PM MAIL   Вверх
Wolfgan
Дата 21.4.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2008

Репутация: нет
Всего: нет



Для запуска другого процесса можно использовать CreateProccess или ShellExecute
Для обмена можно использовать технологию DDE или как вариант работать по TCP/IP.

Использовать CreateProcess - предпочтительней. Т.к. таким образом легче управлять запущенным дочерним процессом. Например можно отследить когда оно закроется или например подчинить себе и много других фичей.

Вариант обмена по DDE уже как бы староват, да и по TCP/IP - можно и по сети рулить. Тут не так сложно. Можно заложить в обе программы набор команд. Т.е. при подачи команды с клиента на сервер, на сервере выполняются какието действия после чего результат возвращается клиенту. В общем солжно написать не большой протокол обмена (надстройкой над TCP/IP) между приложениями.

Но это все мытарства. Почитай про технологию COM, DCOM. Там это уже все встроено 

smile 
PM MAIL   Вверх
Poseidon
Дата 21.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(pavelv @  21.4.2008,  11:40 Найти цитируемый пост)
 А может проще из первого приложения обратиться ко второму приложению и передать ему данные? Какие есть для этого функции?
SendMessage, PostMessage



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
SlaUr
Дата 21.4.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Цитата

SendMessage, PostMessage

насколько я знаю они передают только цифровые значения или не только?
т.Е.Строку допустим через них передать нельзя или я не прав?
PM MAIL   Вверх
saneea
Дата 21.4.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Есть ещё такая вещь как "файл отображаемый в память". Это очень мощное "оружие", т.к. с помощью него любое количество программ могут работать с одной областью памяти через указатель.

Вот прикрепляю файл с моей лабораторной работой (а точнее с двумя: в одной передаются числа, а в другой строки(пример одностороннего чата)) и фрагментом методички.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  lab.rar 31,27 Kb
PM MAIL   Вверх
THandle
Дата 22.4.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(SlaUr @  21.4.2008,  22:26 Найти цитируемый пост)
насколько я знаю они передают только цифровые значения или не только?
т.Е.Строку допустим через них передать нельзя или я не прав? 


Это почему же?

Да вот хотя бы есть какое-то наше приложение с формой класса TForm1 и находящемся на ней Edit'ом.
Пересылаем в него текст. Всё отлично работает и со строками.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  msg : string;
begin
  h := FindWindowEx(FindWindow('TForm1', nil), 0, 'TEdit', nil);
  msg := 'SomeText';
  SendMessage(h, WM_SETTEXT, 0, LParam(msg));
end;

PM   Вверх
pavelv
Дата 24.4.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Всем спасибо, с FindMessage и PostMessage пока способ прозрачнее поэтому по нему и пошёл. Единственно FindWindow('TForm1', nil), а нужно FindWindow('TForm1', ''). Но пока не понимаю как передать инфу не во ВСЕ TEdit, а именно в конкретный по заданному названию? Возможно вообще такое?

P.S> sanea идея неплохая, но тут думаю достаточно обойтись чем-нибудь потривиальнее.

Добавлено через 6 минут и 36 секунд
Пока писал понял, что ещё кое-что интересно. Таким способом передать данные в переменную нереально? Тоесть работа ведется только с компонентами?
PM MAIL   Вверх
SlaUr
Дата 24.4.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Цитата

Пока писал понял, что ещё кое-что интересно. Таким способом передать данные в переменную нереально? Тоесть работа ведется только с компонентами?

Присоеденяюсь к вопросу .Очень интересно.
Я думаю что в переменную не занести.

Это сообщение отредактировал(а) SlaUr - 24.4.2008, 08:15
PM MAIL   Вверх
THandle
Дата 24.4.2008, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(pavelv @  24.4.2008,  08:57 Найти цитируемый пост)
Таким способом передать данные в переменную нереально?

Нет.
Послать или отправить сообщение можно только оконному компоненту.


Это сообщение отредактировал(а) THandle - 24.4.2008, 08:37
PM   Вверх
Poseidon
Дата 24.4.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(pavelv @  24.4.2008,  07:57 Найти цитируемый пост)
Таким способом передать данные в переменную нереально?
Все реально. Вот пример как будем передавать integer.

В "посылающей" программе:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  msg : integer;
begin
  h := FindWindow(nil, 'Form1');
  msg := 10; // передаваемое значение переменной
  SendMessage(h, WM_USER+1, msg, 0);
end;



в "принимающей":
Код
{...}
type
  TForm1 = class(TForm)
{...}
  protected
  procedure WMUSER1(var Msg: TMessage); message WM_USER+1;
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.WMUSER1(var Msg: TMessage);
var
  i: integer; 
begin
i:= Msg.WParam; // получаем данные
ShowMessage(IntToStr(i)); // показываем что получили
end;
end.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Poseidon
Дата 24.4.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Не совсем ясно что значит "на прямую"? Можно переменную сделать глобальной, тогда и использовать сможем ее везде. Или имеется ввиду как делает ArtMoney, менять значение прямо в памяти?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
pavelv
Дата 24.4.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Poseidon спасибо - всё клёво, целое передаёт. Как передать строку додумать не могу, в типе TMessage нету строковых. Есть такая возможность?
Один вопрос остался в воздухе, можно ли при передачи по компоненту передать конкретному TEdit с именем EditX(к примеру). Или он всегда будет передавать последнему?


P.S> Может есть какой-нибудь фак в инете по этому поводу, а то неудобно спрашивать каждую строчку.
PM MAIL   Вверх
THandle
Дата 24.4.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



pavelv, да точно также. Просто при передаче приводишь строчку к WParam, а при приеме обратно в строку.

Вот как нибудь так:


Передаём:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  msg : string;
begin
  h := FindWindow(nil, 'Form1');
  msg := 'SomeText'; 
  SendMessage(h, WM_USER+1, WParam(msg), 0);
end;



Принимаем:

Код

type
  TForm1 = class(TForm)
  {...}
  protected
    procedure WMUSER1(var Msg: TMessage); message WM_USER+1;
  end;



Код

procedure TForm1.WMUSER1(var Msg: TMessage);
var
  s : string;
begin
  s := PChar(Msg.WParam);
  ShowMessage(s);
end;



PM   Вверх
pavelv
Дата 24.4.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Принимающая программа в этом случае получает не те данные - каракули в общем
PM MAIL   Вверх
Poseidon
Дата 24.4.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(pavelv @  24.4.2008,  11:44 Найти цитируемый пост)
Принимающая программа в этом случае получает не те данные - каракули в общем
Показывай свой код. У меня на Delphi 7 все передается как надо. Хотя я бы s все же обьявил как PChar. Для парадку smile

Добавлено через 4 минуты и 37 секунд
Цитата(pavelv @  24.4.2008,  11:25 Найти цитируемый пост)
Один вопрос остался в воздухе, можно ли при передачи по компоненту передать конкретному TEdit с именем EditX(к примеру)
Ну раз обы кода можно редактировать, то значит можно "вытянуть" иня нужного едита. Тогда все просто. Код THandle измени на:

Код
procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  msg : string;
begin
  h := FindWindowEx(FindWindow('TForm1', nil), 0, 'TEdit', 'EditX'); // посылаем в TEdit у которого Name = EditX
  msg := 'SomeText';
  SendMessage(h, WM_SETTEXT, 0, LParam(msg));
end;






--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.