
Обмен данными между процессами с помощью WM_COPYDATA

Обмен данными между процессами с помощью WM_COPYDATA
Обмен данными между процессами приложений может выполняться различными способами. Это может быть shared-память, буфер обмена, COM-объекты и другие высокоуровневые способы. Но наиболее простым и понятным способом является передача данных с использованием сообщения WM_COPYDATA. В этом случае обмен происходит через ядро системы с выделением памяти в принимающем процессе. Таким образом, например, выполняется взаимодействие с окном плеера JetAudio.
Взаимодействие выполняется через структуру COPYDATASTRUCT. В ней всего три поля - идентификатор типа передаваемых данных, размер данных и указатель на данные. Вот так это делается:
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- cdata COPYDATASTRUCT
- szStr db 'Hello!',0
- szWindow db 'Reciever Window',0
- ...
- ...
- ; Сегмент кода
- ...
- ...
- ; Тип передаваемых данных
- mov [cdata.dwData],0
- ; Длина строки
- invoke lstrlen,szStr
- ; Учитываем финальный символ 0x00 в строке
- inc eax
- mov [cdata.cbData],eax
- ; Указатель на строку
- mov [cdata.lpData],szStr
- ; Найти окно приемника
- invoke FindWindow,NULL,szWindow
- or eax,eax
- jz .processed
- ; Отправить данные получателю
- invoke SendMessage,eax,WM_COPYDATA,[hwnddlg],cdata
- jmp .processed
При передаче текстовых данных нужно учитывать завершающий нулевой символ и включать его в длину строки. То есть при передаче пустой строки длина передаваемых данных все равно будет 1 символ.
В окне приложения-получателя отслеживается сообщение WM_COPYDATA, его обработка выполняется примерно так:
Code (Assembler) : Убрать нумерацию
- ; Пришло сообщение WM_COPYDATA?
- cmp [msg],WM_COPYDATA
- je .wmcopydata
- ...
- ...
- .wmcopydata:
- ; В lparam приходит указатель на структуру COPYDATASTRUCT
- mov ebx,[lparam]
- ; Это нужный тип данных?
- cmp [ebx+COPYDATASTRUCT.dwData],0
- ; Нет, пропускаем
- jne .processed
- ; Размер данных нулевой?
- cmp [ebx+COPYDATASTRUCT.cbData],0
- ; Да, тоже пропускаем
- je .processed
- ; Скопировать полученные данные в наше приложение
- mov esi,[ebx+COPYDATASTRUCT.lpData]
- mov edi,myOwnBuff
- mov ecx,[ebx+COPYDATASTRUCT.cbData]
- rep movsb
Примеры программ с исходными текстами в приложении. Одна из программ передает другой текстовую строку и затем получает от нее изображение.
Просмотров: 2593 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!

Добавить комментарий
Заполните форму для добавления комментария

2. Буфер обмена
3. Memory_Mapped_File
4. страничный файл
5. Mailslot
6. Named_Pipe
7. DDE
8. Evet_Pipes
9. Mutex
10. Semaphore
11. Sockets
Хотелось бы побольше узнать об обмене данными между COM-сервером и COM-клиентом