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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
15-1261447784
xayam
2009-12-22 05:09
2010.03.07
Проект Россия 3


11-1212953619
Elec3C
2008-06-08 23:33
2010.03.07
TKOLmdvXLGrid


2-1262457629
Lordalexander
2010-01-02 21:40
2010.03.07
Окна


3-1235913922
sco
2009-03-01 16:25
2010.03.07
ошибка в SQL коде


1-1239618386
Заикин Сергей
2009-04-13 14:26
2010.03.07
Собственная отрисовка иконок в TreeView и ListView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский