Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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. Там это уже все встроено 

smile 

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

Автор: SlaUr 21.4.2008, 21:26
Цитата

SendMessage, PostMessage

насколько я знаю они передают только цифровые значения или не только?
т.Е.Строку допустим через них передать нельзя или я не прав?

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

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

Автор: THandle 22.4.2008, 08:42
Цитата(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;

Автор: 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
Цитата(pavelv @  24.4.2008,  08:57 Найти цитируемый пост)
Таким способом передать данные в переменную нереально?

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

Автор: Poseidon 24.4.2008, 08:54
Цитата(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.

Автор: 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, а при приеме обратно в строку.

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


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

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;



Автор: pavelv 24.4.2008, 11:44
Принимающая программа в этом случае получает не те данные - каракули в общем

Автор: Poseidon 24.4.2008, 16:21
Цитата(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;




Автор: pavelv 25.4.2008, 07:52
Пробовал на Delphi5, затем на Delphi7 ситуация одна. 
Код отправителя:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  msg : pchar;
begin
  h := FindWindow('TForm1','');
  msg := 'Кирова';
  SendMessage(h, WM_USER+1, WParam(msg), 0);
end;



Код получателя:
Код

  protected
    procedure WMUSER1(var Msg:TMessage); message WM_USER+1;

procedure TForm1.WMUser1(var Msg:TMessage);
begin
 Edit1.Text:=Pchar(Msg.WParam);
end;

Но есть одна особенность. Если при отправке взять вот эти данные: IntToStr(WParam(msg)) -- понятно будут какие-то цифры, и сделать в отправителе Pchar(IntToStr(WParam(msg))), то получим строку для отправки. Если в получателе взять IntToStr(Msg.WParam) то получаются теже цифры, то при переводе в буквы уже загагулины вылазят. Похоже на косяки с кодировкой, но слабо понимаю как так в одном приложении всё пучком, а в другом нет.

Автор: Poseidon 25.4.2008, 08:36
Я же тебе выше написал как прямо в Edit отправлять текст...

Автор: pavelv 25.4.2008, 13:14
Это всё понял, спасибо smile. Я бы и числами название передал закодировав, теперь просто интересно как строку передать таким образом. Тоесть если у вас работает просьба выкинуть сюда два exe-шника(ибо исходники одни), а я на своей тачке затестирую...Сомневаюсь, что что-нибудь поменяется, но иногда такое видишь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)