WM_COPYDATA: может ли получатель изменить содержимое COPYDATASTRUCT? - PullRequest
3 голосов
/ 21 марта 2012

Я пытаюсь установить связь между двумя приложениями Windows в Delphi.Отправитель отправляет команды через SendMessage, используя WM_COPYDATA.Эта часть работает нормально.Возможно ли для получателя ответить на несколько строк результата в одном и том же вызове?Для меня это сбой, и вот что происходит сейчас:

  1. Отправитель использует WM_COPYDATA для отправки команды Получателю, используя блокирующий вызов SendMessge.

  2. Получатель обрабатывает команду и изменяет COPYDATASTRUCT с некоторыми результирующими строками, которые необходимо отправить обратно отправителю и выйти из обработчика события.

  3. Функция получателя "SendMessage" возвращает, носодержимое COPYDATASTRUCT остается неизменным.

Очевидно, что механизм обмена сообщениями Windows не разделяет память COPYDATASTRUCT между двумя приложениями.Вместо этого он делает копию.

Ответы [ 2 ]

6 голосов
/ 21 марта 2012

WM_COPYDATA делает только то, что говорит: копирует данных из исходного процесса в целевой процесс.Он не копирует данные обратно из целевого процесса в исходный процесс.Если вы хотите двунаправленную связь, отправьте другое сообщение в другом направлении.

5 голосов
/ 21 марта 2012

Пожалуйста, ознакомьтесь с документацией . Раздел замечаний накладывает следующие правила:

Принимающее приложение должно рассматривать данные только для чтения. Параметр lParam действителен только при обработке сообщения. Принимающее приложение не должно освобождать память, на которую ссылается LPARAM. Если получающее приложение должно получить доступ к данным после SendMessage возвращает, он должен скопировать данные в локальный буфер.

...