Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Как коректно дать комманду с одной на другую *.EXE 


KvORubin   (2002-04-16 09:15) [0]

Имеется 2 проекта, и нужно дать комманду второму, чтоб он выполнил ту или инную процедуру.
(не через: внешние файлы и реестр)



LazorenkoX   (2002-04-16 09:24) [1]

Обе ЕХЕ должны быть запущены и иметь объекты, которые могут принимать сообщения системы, например TForm.

//В обоих ЕХЕ при запуске:
VAL_MSG := RegisterWindowMessage(STR_MSG);

//Посылаем:
SendMessage(HWND_BROADCAST, VAL_MSG, ...);

//Принимаем
TForm.DefaultHandler(var Message: TMessage);
begin
if Message.Msg = VAL_MSG then begin
...
end else inherited DefaultHandler(Message);
end;
//Может где есть небольшая ошибка или глупость, но примерно так.



KvORubin   (2002-04-16 10:02) [2]


Кто такой VAL_MSG ???
Чё-то ничего не получается, напишите пожалусто полноценный пример, хотя-бы одного ехе.



LazorenkoX   (2002-04-16 10:10) [3]


const
STR_MSG = "description of unique my message";

var
VAL_STR: LongInt;

//Перекрываем в форме стандартный обработчик:
//Там где описание процедур в конструкторе формы:
type
TForm1 = ...
...
procedure DefaultHandler(var Message: TMessage); override;
...
private
...
public
...
end;


procedure TForm1.DefaultHandler(...);
... тут всё как я уже писал



KvORubin   (2002-04-16 10:33) [4]


//Вот как я всё это понял:
//Отредактируйте пожалусто как правельно, а то я только
//начинающий и троеточий непонимаю :(

unit Peredacha;

interface

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

var
VAL_STR: LongInt;

const
STR_MSG = "description of unique my message";

type
TForm1 = class(TForm)
Button1: TButton;
procedure DefaultHandler(var Message: TMessage); override;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);

private
public
end;

var
Form1: TForm1;
{VAL_STR: LongInt;}
implementation

{$R *.dfm}

procedure TForm1.DefaultHandler(var Message: TMessage);
{var
VAL_STR: LongInt;}
begin

if Message.Msg = VAL_MSG then begin
showmessage("OK");
end
else
inherited DefaultHandler(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
VAL_MSG := RegisterWindowMessage(STR_MSG);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST,VAL_MSG,1);
end;


end.



Fredericco   (2002-04-16 10:34) [5]

LazorenkoX >> А не будет ли проще через TClientSocket и TServerSocket?



Johnny Smith   (2002-04-16 10:52) [6]

С сокетами в таком простом деле лучше не связываться (я тут в последнее время играюсь с ними на досуге, ряд вопросов решил, но еще три ряда таких же появилось :-).
Обмен информацией между одновременно запущенными на одном компе прогами блестяще поддерживает COM. Я бы рекомендовал именно его. Навскидку код привести не могу. Советую взять книжку Эрика Хармона про COM и DCOM в Delphi.



KvORubin   (2002-04-16 16:50) [7]

> LazorenkoX ©
Плиз,Плиз,Плиз отредактируйте, это очень нужно,
пишу почтовую программу, она состоит из 3 ехе,
мне просто необходимо наладить связь между ними, ПЛИЗ !!!



LazorenkoX   (2002-04-16 17:15) [8]

Тут я всё исправил:

unit Unit1;

interface

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

const
MY_MESSAGE = "LazorenkoX HELLO WORLD";

var
MY_MESSAGE_WIN_VALUE: Cardinal;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure DefaultHandler(var Message); override;
procedure Button1Click(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
MY_MESSAGE_WIN_VALUE := RegisterWindowMessage(MY_MESSAGE);
end;

procedure TForm1.DefaultHandler(var Message);
begin
with TMessage(Message) do
if (Msg = MY_MESSAGE_WIN_VALUE) and (wParam <> Integer(Handle)) then begin
SetForegroundWindow(Handle);
MessageBox(Handle, "Hello World!", "", MB_ICONEXCLAMATION);
end
else inherited DefaultHandler(Message);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST, MY_MESSAGE_WIN_VALUE, Handle, 0);
end;

end.



KvORubin   (2002-04-16 17:38) [9]


Круто !!! - отлично работает, СПАСИБО БОЛЬШОЕ !!!



Fantasist   (2002-04-17 08:29) [10]

Fredericco © (16.04.02 10:34)
LazorenkoX >> А не будет ли проще через TClientSocket и TServerSocket?


--------------------------------------------------------------------------------
Johnny Smith © (16.04.02 10:52)
С сокетами в таком простом деле лучше не связываться (я тут в последнее время играюсь с ними на досуге, ряд вопросов решил, но еще три ряда таких же появилось :-).
Обмен информацией между одновременно запущенными на одном компе прогами блестяще поддерживает COM. Я бы рекомендовал именно его. Навскидку код привести не могу. Советую взять книжку Эрика Хармона про COM и DCOM в Delphi.

Вы что? Какие сокеты, какие COM? Это чтобы на одном компьютере передать сообщение из одного процесса в другой? Выше приведен правельный вариант для таких случаев.



REA   (2002-04-17 10:10) [11]

Читайте IPC (DDE, COM, DCOM, Pipes, Sockets, Memory mapped files) и т.п.



KvORubin   (2002-04-17 10:34) [12]

> LazorenkoX ©

Я вот тут ковырялся ковырялся, но так и непонял одной простой вещи:
Нужно послать комманду другой ехе, а она по этой команде выполнит что-то.

=========================================
Допустим Подача комманды:

Begin
Project2.scommandovatь:="send";
Project2.scommandovatь:="load";
Project2.scommandovatь:="close";


Когда пришла комманда:

Begin
if S="send" then send;
if S="load" then load;
if S="close" then close;

============================================

Вот впринцепе и весь смысл,,
только его надо написать чтоб он работал.

А в Вашем примере я несмог ничего такого найти, или
комманды могут быть цифровыми, это без разници.

Напишите ПАЖАЛУСТО такой пример,, где он будет работать по выше описанному смыслу !!!???



REA   (2002-04-17 10:36) [13]

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



KvORubin   (2002-04-17 13:54) [14]

> REA (17.04.02 10:36)
обратись в конференцию "потрепаться" - там ты найдёшь себе друзей.



Alx2   (2002-04-17 14:05) [15]

>KvORubin © (17.04.02 10:34)
Через wParam или lParam можно передавать коды команд. Например send = 1, load = 2 и т.д. А в обработчике проверяешь что пришло в этих параметрах и делаешь то, что надо.
Если нужно переслать какую-то более объемную информацию, используй сообщение Wm_CopyData. Либо Memory Mapped Files.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.024 c
1-94367           Bodia                 2002-04-15 12:18  2002.04.29  
Какой компонент самый лутший для роботы с FTP?


4-94609           Begunkov              2002-02-21 20:00  2002.04.29  
Блокировка части файла


14-94549          Nest                  2002-03-21 14:42  2002.04.29  
Как сделать недоступными некоторые items в TListBox? Или есть другой компонент с такой фичей?


1-94432           Rammst                2002-04-11 07:36  2002.04.29  
HELP!!!!!


3-94256           mrl                   2002-04-07 16:38  2002.04.29  
ADO вместо BDE?