Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

Как передать адрес строки в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
3-77758
big_bugzy
2003-07-01 20:06
2003.07.24
Помогите разобраться Insufficient key column information


3-77738
Serval
2003-07-01 08:12
2003.07.24
Данные в отчет из БД


14-78130
Председатель
2003-07-06 10:58
2003.07.24
Мисс Delphi


1-77919
jiura1
2003-07-10 13:12
2003.07.24
А как работать в Grid-е со свойством ToplLeft?


14-78062
Aga
2003-07-05 13:13
2003.07.24
Ура!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский