Форум: "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