Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1197965975
@!!ex
2007-12-18 11:19
2008.01.20
Установка компонентов на Turbo Delphi Explorer


2-1197854221
Bpeguk
2007-12-17 04:17
2008.01.20
Конвертер систем


2-1197995133
Виктор
2007-12-18 19:25
2008.01.20
Сворачивание окна


3-1189665566
Quart
2007-09-13 10:39
2008.01.20
Exception EPrinter


15-1197464538
em240
2007-12-12 16:02
2008.01.20
Автоматизация установки служб в рамках домена.





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