Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача данных другому приложению


Автор: former 2.7.2007, 08:51
Есть два приложения. Оба написаны мной.Первое приложение вызывает второе и должно передать значение некоторой переменной. Второе в свою очередь, если запускается отдельно, имеетстартовое окно (в событии onActivate главной формы) в котором выбираеся действие. Задача сосотоит в том, чтобы при запуске первым приложением второго стартовое окно не показывалось. Что-то типа следующей конструкции (я думаю):

Код

....

if Variable=0 then
  begin
      StartForm.ShowModal;
  end
else if Variable=1 then
  begin
      .....
  end;


Или есть другой метод?

Как реализовать передачу значения этой переменной?

Автор: Rennigth 2.7.2007, 08:58
former, А чем командная строка не устраивает?

Автор: former 2.7.2007, 09:01
Rennigth, поточнее, что ты имеешь виду?

Автор: Alexeis 2.7.2007, 09:06
Цитата(former @  2.7.2007,  08:51 Найти цитируемый пост)
Как реализовать передачу значения этой переменной? 

  SendMessage();

Автор: Rennigth 2.7.2007, 09:08
Цитата(former @  2.7.2007,  09:01 Найти цитируемый пост)
Rennigth, поточнее, что ты имеешь виду? 

Хм, то и имею. Сделай чтобы первое приложение запускало второе с параметром например:
Код

  WinExec('C:\test.exe HideSplash');

А во втором приложении анализировать ParamStr;
Код

If (ParamCount > 0) and (ParamStr(1) = HideSplash) then
  //Не показывать заставку
else
  //Показывать заставку



Автор: former 2.7.2007, 09:31
Rennigth, спасибо за подсказку. Все получилось. Только в твоём коде кое-чего не хватает:

1. 
Код

  WinExec(PChar('C:\test.exe HideSplash'),SW_SHOW);


2. 
Код

If (ParamCount > 0) and (ParamStr(1) = 'HideSplash') then
  //Не показывать заставку
else
  //Показывать заставку


Так я думаю будет лучше. smile

А вариант какой лучше или надёжнее, Rennigth или Alexeis?

Добавлено через 2 минуты и 7 секунд
PChar написал, т.к. использовал следующую конструкцию:
Код

  WinExec(PChar(ExtractFilePath(paramstr(0))+'Project2.exe HideSplash'),SW_SHOW);

Автор: Rennigth 2.7.2007, 09:40
Цитата(former @  2.7.2007,  09:31 Найти цитируемый пост)
Только в твоём коде кое-чего не хватает:

Ну писал как наводку smile Вообще запускать лутше через CreateProcess, т.к. WinExec марально устарела.

Цитата(former @  2.7.2007,  09:31 Найти цитируемый пост)
А вариант какой лучше или надёжнее, Rennigth или Alexeis?


Мне кажется что в данном случае не целесообразно изобретать велосипед с SendMessage-м и WM_COPYDATA и т.д. когда для этого механизм передачи параметров через командную строку и служит. 

Автор: Alexeis 2.7.2007, 09:44
Цитата(Rennigth @  2.7.2007,  09:40 Найти цитируемый пост)
Мне кажется что в данном случае не целесообразно изобретать велосипед с SendMessage-м и WM_COPYDATA и т.д. когда для этого командная строка и служит. 

  Угу я не дочитал что первая запускает вторую.  smile  Более того когда дойдет WM_COPYDATA неизвестно, а командная строка будет передана сразу.

Автор: former 2.7.2007, 09:59
Rennigth, Alexeis, спасибо за ваши рекомендации. Постараюсь разобраться и со вторым вариантом тоже.

И на последок.

Цитата(Alexeis @  2.7.2007,  09:44 Найти цитируемый пост)
Угу я не дочитал что первая запускает вторую.    Более того когда дойдет WM_COPYDATA неизвестно, а командная строка будет передана сразу. 


Т.е., если я правильно понял, если система перегружена процессами, то неизвестно вовремя ли произойдёт передача параметров?

Автор: Alexeis 2.7.2007, 10:18
Цитата(former @  2.7.2007,  09:59 Найти цитируемый пост)
Т.е., если я правильно понял, если система перегружена процессами, то неизвестно вовремя ли произойдёт передача параметров? 

  Ага, сообщения обрабатываются асинхронно, но в порядке их поступления.

Автор: Rennigth 2.7.2007, 10:20
Цитата(former @  2.7.2007,  09:59 Найти цитируемый пост)
Т.е., если я правильно понял, если система перегружена процессами, то неизвестно вовремя ли произойдёт передача параметров? 


Ну да. К примеру если использовать вариант с передачей параметров через SendMessage:

Код

WinExec(PChar('C:\test.exe HideSplash'),SW_SHOW);

FindWindow(...) // Ищем главное окно второго приложения, и не факт что оно уже создано.
Sendmessage(hMainWindow, WM_COPYDATA, 0, (флаг какой-то)) еще не известно была ли проверка показывать или нет стартовое окно. Да и приложение вообще может не иметь окна которое будет принимать сообщение.

Вообщем чтобы пользоваться этим вариантом придется изобретать еще и велосипед с ожиданием приема параметра во втором приложении и ожиданием возможности  отправки передачи параметра у первого.

Автор: former 2.7.2007, 10:23
А приоритет сообщения менять никак нельзя?

Автор: Rennigth 2.7.2007, 10:34
Цитата(former @  2.7.2007,  10:23 Найти цитируемый пост)
А приоритет сообщения менять никак нельзя? 

Чтобы это могло значить? Приоритет есть у процессов и потоков. Если ты имеешь ввиду как можно побыстрее прогнать очередь сообщений для какогото окна... То это исключительно зависит от загружености процесса. Сообщения он принимает грубо говоря в Idle, или можно в принимающем приложении вызвать Application.ProcessMessages. Но ситуцию это все равно не изменит. В данном случае используй передачу параметра через командную строку.

Автор: former 2.7.2007, 11:06
Всем спасибо. Тема закрыта.

Автор: MetalFan 2.7.2007, 12:54
можно мое имхо? все-таки на то оно и WM_COPYDATA, чтобы данные между процессами передавать... а вот с ком.строкой как раз изврат.

Автор: Alexeis 2.7.2007, 13:06
Цитата(MetalFan @  2.7.2007,  12:54 Найти цитируемый пост)
можно мое имхо? все-таки на то оно и WM_COPYDATA, чтобы данные между процессами передавать... а вот с ком.строкой как раз изврат. 

  В данном случае с командной строкой как раз красиво. Суть в том что прога может запускаться с ярлыка либо другой прогой. В зависимости от параметров командной строки меняется режим работы самой проги. Это нормальная практика. Да и сама делфи поддерживает различные параментры. В данном случае вопрос не в том чтобы обеспечить взаимодействие двух приложений, а именно установить нужный режим работы.

Автор: former 2.7.2007, 14:46
Alexeis, в самую точку! Спасибо. +

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