Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SendMessage [D7]


NanoTek ©   (2010-01-02 18:34:00) 

Здравствуйте, есть задача - отправить текст другому окну при помощи 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-05 16:59:00) [1]

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


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


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


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


RWolf   (2010-01-05 16:01:00) [3]

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


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

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


sniknik   (2010-01-03 12:06:00) [5]

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

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

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


Демо   (2010-01-03 07:57:00) [6]


> NanoTek   (02.01.10 18:34) 


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


GanibalLector   (2010-01-02 22:58:00) [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;


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

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

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 будет висеть с надписью "Не отвечает"!


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

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


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

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


sniknik   (2010-01-02 21:07:00) [11]

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

WM_COPYDATA

Remarks

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

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


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

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


sniknik   (2010-01-02 18:52:00) [13]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо