Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Как передать адрес строки в SendMessage?   Найти похожие ветки 

 
Игорь200305   (2003-05-21 10:01) [0]

Есть две программы. Надо передать из первой программы в другую некую строку. Решил попробовать так:

В первой есть такая процедура, но я не знаю, как её доделать

procedure TForm1.Button1Click(Sender: TObject);
var
s:PChar;
begin
s:=PChar(Edit1.Text);
SendMessage(HWND_BROADCAST,
RegisterWindowMessage(PChar("MyMsg")),
[А здесь я хочу передать строку S...],
[Или здесь...]);
end;


Другая программа должна иметь возможность получить эту строку (и сообщение), поэтому пишу в ней

var
MyMsg:DWORD;
OldWindowProc:Pointer;

implementation

{$R *.dfm}
//процедура обработки сообщения
function NewWindowProc(WindowHandle: hWnd; TheMessage : LongInt; ParamW : LongInt; ParamL : LongInt) : LongInt; stdcall;
begin
if TheMessage = MyMsg then begin

[получить строку]

Form1.Label1.Caption:= [А здесь надо вывести строку>];
Result:= 0;
end else
Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyMsg:=RegisterWindowMessage(PChar("MyMsg"));
OldWindowProc := Pointer(SetWindowLong(WindowHandle, GWL_WNDPROC, LongInt(@NewWindowProc)));
end;


 
Skier ©   (2003-05-21 10:05) [1]


> Надо передать из первой программы в другую некую строку.
>

WM_COPYDATA !


 
MBo ©   (2003-05-21 10:06) [2]

1) Используй WM_COpyData
2) Для обработки формой сообщения не нужно перекрывать windowproc - достаточно ввести метод-обработчик
procedure MyMsgHandler(var M:TMessage); message My_Message;


 
Polevi ©   (2003-05-21 10:49) [3]

2MBo © (21.05.03 10:06)
у него My_Message динамический


 
Игорь200305   (2003-05-21 11:04) [4]

Пробую...
Написал (не знаю, правильно или нет):

procedure TForm1.Button1Click(Sender: TObject);
var
s:PChar;
x:tagCOPYDATASTRUCT;
begin
s:=PChar(Edit1.Text);
x.cbData:=SizeOf(s);
x.lpData:=s;
SendMessage(HWND_BROADCAST,RegisterWindowMessage(PChar("test")), 0, LongInt(@x));
end;

а как в другой программе получить эту строку?

Пробовал так - не работает
var S:PChar;
px:^tagCOPYDATASTRUCT;
begin
if TheMessage = MyMsg then begin
px:=Ptr(ParamL);
S:=px^.lpData;
MyForm1.Label1.Caption:=S;


 
DesWind   (2003-05-21 11:07) [5]

Более универсальный метод это отобразить в памяти файл общий для двух программ. Код к сожалению щас не напишу. Но попробуй поройся в Win SDK функция MapViewFile или что-то в этом роде. Две программы открывают этот файл и обмениваются через него строками числами т.д.


 
Skier ©   (2003-05-21 11:08) [6]

>Игорь200305 (21.05.03 11:04)
Сказали же - WM_COPYDATA.
А ты что пишешь ?!


 
Игорь200305   (2003-05-21 11:15) [7]

Пробую...
Написал (не знаю, правильно или нет):

procedure TForm1.Button1Click(Sender: TObject);
var
s:PChar;
x:tagCOPYDATASTRUCT;
begin
s:=PChar(Edit1.Text);
x.cbData:=SizeOf(s);
x.lpData:=s;
SendMessage(HWND_BROADCAST,RegisterWindowMessage(PChar("test")), 0, LongInt(@x));
end;

а как в другой программе получить эту строку?

Пробовал так - не работает
var S:PChar;
px:^tagCOPYDATASTRUCT;
begin
if TheMessage = MyMsg then begin
px:=Ptr(ParamL);
S:=px^.lpData;
MyForm1.Label1.Caption:=S;


 
Игорь200305   (2003-05-21 11:19) [8]

Сорри, запостил два раза...

Насколько я понимаю, разницы не будет никакой, потому что передаются в итоге два числа ParamW и ParamL, а способ их обработки указывает само сообщение.

А если я знаю, какие данные я передаю, то я знаю как их обрабатывать при приёме, и это не должно зависеть от типа сообщения, так?

Проблема в том, что я не могу их принять!


 
Skier ©   (2003-05-21 11:23) [9]

>Игорь200305 (21.05.03 11:19)

> А если я знаю, какие данные я передаю, то я знаю как их
> обрабатывать при приёме, и это не должно зависеть от типа
> сообщения, так?

В данном случае - нет.


 
Игорь200305   (2003-05-21 11:34) [10]

Спасибо!
Заработало!

{приёмник}
var
S:array of char;
px:^tagCOPYDATASTRUCT;
begin
if TheMessage = WM_COPYDATA then begin
px:=Ptr(ParamL);
SetLength(S,px.cbData);
S:=px.lpData;
MyForm1.Label1.Caption:=string(S);

{передатчик}
var
x:tagCOPYDATASTRUCT;
begin
x.cbData:=Length(Edit1.Text)+1;
x.lpData:=PChar(Edit1.Text);
SendMessage(HWND_BROADCAST,WM_COPYDATA, 0, LongInt(@x));


 
Юрий Зотов ©   (2003-05-21 16:12) [11]

> Игорь200305 (21.05.03 11:19)

> Насколько я понимаю, разницы не будет никакой, потому что
> передаются в итоге два числа ParamW и ParamL, а способ их
> обработки указывает само сообщение.

> А если я знаю, какие данные я передаю, то я знаю как их
> обрабатывать при приёме, и это не должно зависеть от типа
> сообщения, так?

Строка - это указатель на ее первый символ. Поэтому, передавая строку, мы на самом деле передаем адрес ее тела. Приложение-приемник вполне успешно его получает, но в ЕГО адресном пространстве по этому адресу, конечно, располагается совсем другое, а не нужная строка. И так происходит всегда, когда передаются не сами данные, а их адрес - адрес передается нормально, но данные остаются недоступными.

Сообщение же WM_COPYDATA пересылается системой особым образом. Создается некий буфер, в него копируются нужные данные и этот буфер делается доступным приложению-приемнику. Поэтому все проходит ОК.


> DesWind (21.05.03 11:07)

WM_COPYDATA как раз через File Mapping и работает. Только детали реализации система берет на себя.



 
Suntechnic ©   (2003-05-22 07:44) [12]

>Игорь200305
WM_COPYDATA это конечно замечательно, только кто ж broadcast этого сообщения делает? В системе может быть полно приложений, которые WM_COPYDATA обрабатывают и им соовсем необязательно получать ту ерунду(для этих приложений это действительно ерунда), которую ты им послал.

В таком случае, как правило, делают broadcast custom сообщения(как в первом примере через RegisterWindowMessage), а заинтересованное приложение в ответ на это сообщение отсылает свой HWND. И вот этому HWND и посылают WM_COPYDATA.


 
Aleksey Pavlov ©   (2003-05-22 10:19) [13]

Как-то в детстве возникла у меня мысль передать одному из своих приложений данные через WM_COPYDATA, и что бы не мучиться с поиском handle-ов тоже широковещательно передавал. Последствия были печальны для одной из запущенных на моей машине програм: она тоже обрабатывала WM_COPYDATA и при получении моего сообщения палала по AV...
С тех давних пор использую именованные MMF и забот не знаю 8)
Не наступайте граждане на одни и теже гарбли 8)



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-77995
Юрий Федоров
2003-07-11 14:14
2003.07.24
Проверка, абстрактный ли метод


1-77823
Bless
2003-07-09 15:59
2003.07.24
Редактор свойств


14-78038
Карелин Артем
2003-07-04 13:46
2003.07.24
Регистрация программ. Самарская область.


3-77742
Александр Ч_
2003-07-01 09:35
2003.07.24
Параметры в хранимой процедуре IB


3-77722
HardClubber
2003-06-30 16:30
2003.07.24
Что можно использовать?