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

Вниз

SendMessage   Найти похожие ветки 

 
NanoTek   (2010-01-02 18:34) [0]

Здравствуйте, есть задача - отправить текст другому окну при помощи PostMessageW:

Пробовал:
const
 WM_USERTEXT = WM_USER + 123;
var
 Text: PWideChar;
begin
 Text:= "D:\Example\";

 Wnd:= FindWindow(<WindowClass>,nil);
 if Wnd <> 0 then
 begin
    PostMessageW(Wnd,WM_USERTEXT,Integer(Pointer(Text)),0);
 end;


на другом конце, т.е форма которая принимает

TForm1 = class(TForm)
.....
private
.....
procedure GetUserText(var Msg: TMessage); message WM_USERTEXT;
....
end;
implementation
procedure TForm1.GetUserText(var Msg: TMessage);
var
 Text: PWideChar;
begin
 Text:= PWideChar(Pointer(Msg.WParam));
 MessageBoxW(0,Text,0,0); // Вот тут вылетает ошибка Runtime at ****


 
sniknik ©   (2010-01-02 18:52) [1]

текст через post не отправляется, только через send.


 
Сергей М. ©   (2010-01-02 19:42) [2]

Можно и через Post - дишь бы ссылка на стр.данные и сами данные были валидными на момент чтения.


 
sniknik ©   (2010-01-02 21:07) [3]

ну, стандартная пересылка данных все таки имеет это ограничение,

WM_COPYDATA

Remarks

An application must use the SendMessage function to send this message, not the PostMessage function.

может неспроста?


 
sniknik ©   (2010-01-02 21:10) [4]

а вообще, если хочется объяснять в начинающих не как надо, а начиная с исключений, то флаг тебе в руки.


 
Nano-Tek   (2010-01-02 21:42) [5]

на msdn прочитал полностью про PostMessage нарвался на Using Dynamic Data Exchange. В нём рассказывается способ отправки текстовых сообщений кому-либо. Как не странно, мне даже в голову не пришло воспользоваться Атомами. Сделал всё как там описано через PackDDElParam и UnPackDDElParam. На другом конце вышло всё как я хочу. Но у такого способа есть ограничение. Я пишу программу которая копирует файлы, а как правило пути которые ведут к заветным нам файлам не всегда удерживаются в 260 символов (MAX_PATH DelphI)


 
NanoTek   (2010-01-02 21:51) [6]

ну, стандартная пересылка данных все таки имеет это ограничение,

WM_COPYDATA

Remarks

An application must use the SendMessage function to send this message, not the PostMessage function.

может неспроста?

WM_COPYDATA хорошая штука была бы, использовав SendMessage. Но мне нужен именно PostMessage потому что если отправить SendMessage - источник отправки будет ждать ответа. А ответ у меня ждёт библиотека содержащая интерфейсы которые вызываются во время Copy/Paste. Из-за SendMessage библиотека будет ждать ответа, а в это время наш любимый процесс Explorer будет висеть с надписью "Не отвечает"!


 
GanibalLector ©   (2010-01-02 22:58) [7]


type
 TMyData = packed record
   hText  : ShortString;
   hDWord : DWord;
 end;
 PMyData = ^TMyData;

procedure TForm1.Button1Click(Sender: TObject);
 var Q:PMyData;
begin
 New(Q);
 Q^.hText:="Hello,word";
 Q^.hDWord:=$1234;
 PostMessage(Handle,WM_USER+1,wParam(Q),0);
end;

procedure TForm1.Success(var Msg: TMessage);
 var Q:PMyData;
begin
 Q:=PMyData(Msg.WParam);
 Memo1.Lines.Add(Format("%s %d",[Q.hText,Q.hDWord]));
 Dispose(Q);
end;


 
Демо ©   (2010-01-03 07:57) [8]


> NanoTek   (02.01.10 18:34) 


Если тебе так нужно передавать строки в юникоде, выделяй память CoTaskMemAlloc(CoTaskMemRealloc)+CoTaskMemFree и тип данных POleStr (PWideChar).


 
sniknik ©   (2010-01-03 12:06) [9]

GanibalLector ©   (02.01.10 22:58) [7]
при освобождении памяти выделенной другим процессом так, по логике будет AV.

Демо ©   (03.01.10 07:57) [8]
проблема у него не в том что строки в юникоде, а в том что в момент чтения строки процесс источник уже завершился, или освободил память откуда читают, т.е. посланная ссылка в момент чтения стала невалидной, а подождать пока с нее прочитают он не хочет.

> а в это время наш любимый процесс Explorer будет висеть с надписью "Не отвечает"!
трактат типа "Война и Мир" пересылаешь? чего там у тебя такого, что простая пересылка строки, т.е. миллисекунды, выливаются во время которое даже Explorer заметил?


 
Nano-Tek   (2010-01-05 15:46) [10]

Пересылается то всё быстро, но проблема в том что после отправки SendMessage моему приложению - оно начинает выполнять аналогичную виндовому операцию копирования файлов и т.е. пока будет копировать файлы моя программа, Explorer будет висеть.


 
RWolf ©   (2010-01-05 16:01) [11]

Пусть программа вернёт управление до начала копирования.


 
Кука съела ник   (2010-01-05 16:30) [12]


> есть задача - отправить текст другому окну при помощи PostMessageW


отправляй со ссылкой на строку в разделяемой памяти, пример есть в Demos\IPCDemos


 
sniknik ©   (2010-01-05 16:59) [13]

> ... после отправки SendMessage моему приложению ...
какая может быть проблема если это ТВОЕ приложение? переделай на адекватную логику.



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
6-1214280494
Василий
2008-06-24 08:08
2010.03.07
WebBrowser отображение объектов


15-1261321920
asail
2009-12-20 18:12
2010.03.07
Нужен совет по приобретению. нетбука...


15-1261394309
Б
2009-12-21 14:18
2010.03.07
Стрелки в Word 2007.


15-1261527698
KilkennyCat
2009-12-23 03:21
2010.03.07
VBA и application.processmessage


2-1262463589
AntonioBanderas
2010-01-02 23:19
2010.03.07
Принадлежность точки отрезку