Описание слайда:
Сообщение WM_COPYDATA Сообщение WM_COPYDATA позволяет приложениям копировать данные между их адресными пространствами. При этом приложения не обязательно должны быть 32-разрядными — для 16-разрядных приложений поддерживается автоматическая трансляция указателей. Перед отправкой сообщения WM_COPYDATA необходимо инициализировать структуру COPYDATASTRUCT с информацией о предстоящей пересылке данных, в том числе с указателем на блок данных. Затем с помощью функции SendMessage сообщение WM_COPYDATA пересылается в принимающую программу; при этом параметр wParam содержит дескриптор окна вашей программы, а lParam - адрес структуры COPYDATASTRUCT. Когда сообщение поступает обработчику WM_COPYDATA принимающей программы, его средствами указатель может быть скопирован из структуры COPYDATASTRUCT и использован, как любой другой указатель. В принимающем процессе размер блока данных, адрес которого содержит lpData, извлекается из элемента cbData. Значение, считываемое из элемента lpData принимающей программой, возможно, будет отличаться от значения, помещенного туда отправляющей программой. Этого следовало ожидать, поскольку перед передачей сообщения WM_COPYDATA операционная система Windows NT выделяет в адресном пространстве принимающего процесса блок памяти, копирует данные из отправляющего процесса и обновляет значение lpData. По всей вероятности, в адресных пространствах этих процессов адреса размещении блока не совпадут. В структуре COPYDATASTRUCT имеется третье, необязательное поле, dwData, в котором можно передать 32-разрядное значение, определяемое в программе. Только не передавайте в этом поле указатель, потому что в принимающем процессе он не будет воспринят. При использовании метода WM_COPYDATA необходимо помнить об одной детали: сообщения должны именно пересылаться, а не просто регистрироваться. Для того чтобы освободить память, выделенную в адресном пространстве принимающего процесса, операционная система должна быть информирована о моменте завершении пересылки. Кроме того, получатель сообщения WM_COPYDATA должен обращаться с блоком данных так, словно он предназначен только для чтения. Чтобы внести изменении в полученные данные, в принимающей программе необходимо подготовить их локальную копию. И наконец, не следует сохранять указатель, переданный в элементе lpData, дл применения его в дальнейшем.