2013-06-24 3 views
0

Например, я только что вызвал GetMessage (или я нахожусь в обратном вызове CallWndMsg) и получил lParam и wParam.Отправка сообщения с переадресацией

Может использовать SendMessage или PostMessage для отправки этого сообщения в окно другого процесса с использованием только что полученных lParam и wPAram без глубокого копирования. Я имею в виду, что если эти параметры (которые часто содержат указатели на составные структуры) остаются в силе во время повторной отправки или я могу столкнуться с проблемой нарушения памяти (или что-то подобное)? Если я смогу это сделать, как система решила, когда lPAram и wPAram могут быть выпущены и удалены?

PS Кажется, я не могу это сделать для WM_COPYDATA, потому что msdn указал, что все переданные данные живы, только когда обработчик сообщений работает/Но что для других сообщений.

+0

Если вы используете 'SendMessage', он должен блокировать, где он был вызван, поэтому переменные' lParam' и 'wParam' должны оставаться в силе. –

+0

Благодарим за ответ. И что произойдет, если я буду использовать PostMessage или PostThreadMessage? – DotNetter

ответ

2

Вы не должны передавать указатель от процесса A к процессу B, в процессе B такой указатель (адрес) может указывать на свободную память или память, используемые некоторыми другими структурами. WM_COPYDATA - это один из способов передачи данных между процессами, вы можете фактически упаковать каждое из своих сообщений в двоичный массив, отправить его другому процессу с помощью WM_COPYDATA, а в этом втором процессе распаковать его и затем отправить самому себе неупакованное сообщение.

Единственный безопасный способ передачи lParam и wPAram между процессами - это когда они содержат только данные DWORD.