Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2016, 17:05   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Передать команду из одной программы в другую

Есть две программы. Нужно чтобы по команде из первой программы вторая программа начинала какое-то действие. Каким способом это можно сделать?
garuna вне форума Ответить с цитированием
Старый 03.06.2016, 17:35   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Через виндовые сообщения.
Придумываешь сообщение типа WM_MY_MESSAGE = WM_USER + 1;
В первой проге SendMessage/PostMessage, во второй - обработчик события сообщения.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 03.06.2016, 18:17   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зависит от задачи.
Можно и через сообщения винды, и через TCP/names pipe и т.п., и через файлы, ...

Только MSDN вроде говорил, что WM_APP (0x8000) надо, а не USER.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.06.2016, 01:08   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,867
По умолчанию

Существенное уточнение. Обе программы твои?
northener вне форума Ответить с цитированием
Старый 04.06.2016, 09:55   #5
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Существенное уточнение. Обе программы твои?
да, обе программы мои. уже сделал через WM_COPYDATA, но мне говорят что этот способ не очень хорош, поскольку не всегда срабатывает если программа-приемник работает в фоне или не имеет формы. Вот пример:

Код:
//программа-отправитель
procedure TForm1.btn1Click(Sender: TObject);
var
  CDS: TCopyDataStruct;
begin
  CDS.dwData := 0;
  CDS.cbData := (length(edt1.Text) + 1) * sizeof(char);
  CDS.lpData := PChar(edt1.Text);
  SendMessage(FindWindow('TFormReceive', nil), WM_COPYDATA, Integer(Handle), Integer(@CDS));
end;

-----------------------------------

//программа-приемник
  private
    { Private declarations }
   procedure WndProc(var Message: TMessage); message WM_COPYDATA;
...
procedure TFormReceive.WndProc;
begin
  inherited;
  case Message.Msg of
    WM_COPYDATA:
      begin
        Label1.Caption := PChar(TWMCopyData(Message).CopyDataStruct.lpData);
        Message.Result := Integer(True);
      end;
  end;
end;
garuna вне форума Ответить с цитированием
Старый 04.06.2016, 11:04   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
Через виндовые сообщения.
Придумываешь сообщение типа WM_MY_MESSAGE = WM_USER + 1;
В первой проге SendMessage/PostMessage, во второй - обработчик события сообщения.
Головка бо-бо с похмелья? Передаётся только сообщение и то в пределах выделенного окна.
Дайте, я залезу на тот дуб, с которого можно так упасть
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.06.2016, 11:19   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Дайте, я залезу на тот дуб, с которого можно так упасть
это мой дуб. златая цепь на дубе том.

мессадж WM_COPYDATA как раз и предназначено для передачи данных между разными приложениями.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.06.2016, 12:01   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

можно еще устроить апи и экспортнуть функцию, которую дергать
можно организовать какое-нибудь взаимодействие (сокеты, пайпы, разделяемая память, ...) и ждать команды
p51x вне форума Ответить с цитированием
Старый 04.06.2016, 13:40   #9
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Головка бо-бо с похмелья? Передаётся только сообщение и то в пределах выделенного окна.
Дайте, я залезу на тот дуб, с которого можно так упасть
Ну вперед, на дуб


Код программы-передатчика:
Код:
unit mainTr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  //Идентификатор сообщения
  WM_MY_MESSAGE = WM_USER + 1;
  //Имя окна-приемника
  RWndName = 'Приемник';

//Нажимаем на кнопочку
procedure TForm1.Button1Click(Sender: TObject);
var
  //Идентификатор окна-приемника
  RWnd: HWnd;
begin
  //Ищем окно-приемник
  RWnd:=FindWindow(nil, PWideChar(RWndName));

  //Если нашли - отправляем сообщение
  if (RWnd > 0) then
    PostMessage(RWnd, WM_MY_MESSAGE, Application.Handle, 0);
end;

end.
Код программы-приемника:
Код:
unit mainRc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AppOnMessage(var Msg: TMsg; var Handled: boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  WM_MY_MESSAGE = WM_USER + 1;

//Обрабочик событий приложения
procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: boolean);
begin
  Handled:=False;
  if (Msg.Message = WM_MY_MESSAGE) then
  begin
    Panel1.Caption:='Сообщение принято!';
    Handled:=True;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:=AppOnMessage;
end;

end.
Dеlрhі 2010.

З.Ы. Я НЕ говорю, что это самое правильное, изящное и надежное решение, но оно работает. ТС справшивал "вообще", и я написал по памяти то, чем сам когда-то пользовался.
Программирую по необходимости

Последний раз редактировалось tsar_; 04.06.2016 в 13:42.
tsar_ вне форума Ответить с цитированием
Старый 04.06.2016, 15:37   #10
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
Каким способом это можно сделать?
через каллбэк-функцию. И не имеет значение, что это exe, а не DLL )

...пример
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать результат с одной страницы на другую Вероника99 PHP 16 03.05.2016 00:03
Как в VB передать данные с одной формы в другую Vceznayka Microsoft Office Excel 1 26.12.2011 17:13
Передать процедуры и функции из одной DLL в другую Alter Общие вопросы Delphi 12 12.06.2011 00:39
Как передать значение пременной из одной функции в другую? mr.-parker Общие вопросы C/C++ 2 27.03.2010 15:01
C#: Передать значение переменной из одной формы в другую Veiron Общие вопросы .NET 3 29.06.2009 17:43