Форум: "Начинающим";
Текущий архив: 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.004 c