Форум: "Начинающим";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
ВнизЗаморочка с postmessage() Найти похожие ветки
← →
AntiPupkin (2007-12-20 20:28) [0]Хочу послать в окно другого процесса большое текстовое сообщение через postmessage(); соответственно в том оконном приложении есть обработчик:
procedure(var Msg: TMessage); message WM_USER+3;
begin
Inc(Count);
mmInf.Lines.Add(IntToStr(Count)+": "+PChar(Msg.WParam));
end;
А отправляю так:Var StringMsg: String;
//...........................
StringMsg:="большое текстовое приложение";
postmessage(WND,WM_USER+3,Integer(PChar(StringMsg)),0);
Суть вопроса в том что ни чего получть не могу, сообщения не передаются. В пределах одного приложения передаются, в другое приложение нет. Помогите разобраться?
← →
Sergey Masloff (2007-12-20 20:31) [1]Суть вопроса в том что ты пытаешься передать. А передаешь ты указатель. Причем указатель из чужого адресного пространства. А потом по этому указателю идешь куда-то в своем АП. Ну и приходишь...
← →
AntiPupkin (2007-12-20 20:39) [2]
> Sergey Masloff (20.12.07 20:31) [1]
дескать немного понял. Можно ли передать указатель и размер структуры, а затем по этому указателю скопировать?
← →
Германн © (2007-12-20 20:40) [3]
> AntiPupkin (20.12.07 20:28)
Для передачи данных между окнами разных процессов используй сообщение WM_CopyData
← →
Sergey Masloff (2007-12-20 20:46) [4]Германн © (20.12.07 20:40) [3]
PostMessage не может WM_COPYDATA посылать. Вернее, посылать то может и может...
← →
Sergey Masloff (2007-12-20 20:50) [5]Я обычно MemoryMappedFiles использую. Отображаю на файл подкачки виндовый и вперед. А через сообщения передаю смещение и размер чего копировать
← →
AntiPupkin (2007-12-20 20:50) [6]>Германн © (20.12.07 20:40) [3]
If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used.
Но не до конца понимаю как передать данные, интересует конкретная реализация.
← →
AntiPupkin (2007-12-20 20:55) [7]AntiPupkin (20.12.07 20:50) [6]
- сорри, кажется я не то и не туда вставил.
← →
Германн © (2007-12-20 20:56) [8]
> AntiPupkin (20.12.07 20:50) [6]
Ну если действительно нужна асинхронная процедура, то см. например [5].
А если SendMessage все-таки сгодится, тогда пример по WM_CopyData см. тут:
http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988620990&n=15
← →
Sergey Masloff (2007-12-20 20:58) [9]Если хочешь WM_COPYDATA то используй SendMessage()
а сама структура
{ lParam of WM_COPYDATA message points to... }
PCopyDataStruct = ^TCopyDataStruct;
{$EXTERNALSYM tagCOPYDATASTRUCT}
tagCOPYDATASTRUCT = packed record
dwData: DWORD; -- просто 32 любых бита которые будут посланы
cbData: DWORD; -- сколько данных читать по указателю
lpData: Pointer; -- собственно указатель. Может быть нулевым
end;
TCopyDataStruct = tagCOPYDATASTRUCT;
{$EXTERNALSYM COPYDATASTRUCT}
COPYDATASTRUCT = tagCOPYDATASTRUCT;
← →
AntiPupkin (2007-12-20 21:04) [10]Просто не могу разобраться с некоторыми комментариями в описании PostMessage
The system only does marshalling for system messages (those in the range 0 to WM_USER). To send other messages (those above WM_USER) to another process, you must do custom marshalling.
Это что имелось ввиду то очем говорил Sergey Masloff (20.12.07 20:50) [5]?
← →
AntiPupkin (2007-12-20 21:07) [11]
> Германн © (20.12.07 20:56) [8]
</I
> Sergey Masloff (20.12.07 20:58) [9]
>
нужна ассинхронная передача
← →
AntiPupkin (2007-12-20 21:13) [12]
> AntiPupkin (20.12.07 21:07) [11]
ну, если хорошо подумать, то и SendMessage сгодится даже неплохо.
← →
Sergey Masloff (2007-12-20 21:30) [13]Если SendMessage сгодится то все в порядке. Но про MMF лучше тоже почитай вещь мощнейшая и может пригодиться в других задачах. Суть в том что содержимое части файла (дискового или файла подкачки Windows) проецируется в адресное пространство одного или нескольких приложений.
В случае нескольких приложений получаем общую память в которую одно приложение может писать а другое читать все что угодно. Искать по ключевым словам CreateFileMapping, MapViewOfFile...
← →
SergeyIT (2007-12-21 00:33) [14]Можно использовать Atom.
ATOM GlobalAddAtom(
LPCTSTR lpString // pointer to the string to add
);
и т.д.
То есть послать через PostMessage, прочитать в другом приложении и удалить.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.068 c