![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Domoffou |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Как можно отправить свою структуру данных (record) через PostMessage?
Я пробовал так:
|
||||
|
|||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
и не дойдет. PostMessage, в отличие от SendMessage, только кладет сообщение в очередь. твоя структура является локальной переменной и лежит в стеке, который разрушается после выхода из процедуры. таким образом сообщение содержит указатель на недействительный кусок памяти. мало того, по идее, и SendMessage не должен работать, т.к. ты передаешь указатель на область памяти в передающем процессе, а в принимающем процессе этот указатель смысла не имеет. но тут microsoft "подстелила соломки" - SendMessage копирует кусок памяти в адресное пространство получающего процесса. вообще же, корректным способом передачи является сообщение WM_COPYDATA в сочетании с SendMessage. чтобы передавать через PostMessage, надо ужаться до двух DWORD'ов(cardinal) и засовывать их в wParam и lParam. иначе придется использовать MMF(memory mapped files). |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 16 Всего: 89 |
Кто ловит это сообщение? Тот же процесс или нет?
Для двух процессов это не должно работать даже с SendMessage по тем же причинам, что указал dumb: у двух разных процессов индивидуальные адресные пространства и указатель из одного из них не имеет смысла в другом. Чтобы можно было передать данные, нужно соединить часть адресных пространств. Делать это нужно через MMF или любые обёртки для него - например, тот же WM_COPYDATA или пайпы или ещё 100 и один способ.
Ээээ.... вообще-то SendMessage по-умолчанию ничего такого не делает. Только для специальных типов сообщений, например, WM_COPYDATA или WM_GETTEXT. Но уж точно не для пользовательского сообщения. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
![]() было нечеткое воспоминание, что оно для каких-то "левых" сообщений копирует, и показания пациента(все врут (с) хаус), что мол "работает" - вот и предположилоС, что оно умничает на lParam. ![]() каюсь, был неправ, обещаю исправиться. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |