![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.