Форум: "Потрепаться";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизУказатели в параметрах WM_ сообщений. Найти похожие ветки
← →
Igorek © (2004-08-13 15:14) [0]Че-то я недопонял. Например есть сообщение WM_WINDOWPOSCHANGING.
Читаем доку:
"lParam - Pointer to a WINDOWPOS structure that contains information about the window"s new size and position.".
Т.е. при обработке сообщения мы приводим lParam к типу PWindowPos и можем свободно читать/писать в поля этой структуры.
Теперь вопросы:
1) кто выделяет/освобождает память под эту структуру?
2) если память потом освобождается, то как тот, кто это делает, узнает когда надо освободить?
3) в адресном пространстве какого процесса содержится эта структура?
---
Дело в том, что я сначала начал для себя разворачивать подобный механизм. Правда у меня проще - потоки в одном процессе пересылают друг-другу сообщения. Так что любые указатели будут ссылаться на память внутри одного процесса. Но потом подумал, что это неправильно - похерял все. Потом нашел что Винда так делает. Теперь не знаю что и думать.
← →
вразлет © (2004-08-13 15:17) [1]тот кто ее вызвал
← →
Игорь Шевченко © (2004-08-13 15:17) [2]
> 1) кто выделяет/освобождает память под эту структуру?
Никто.
> 3) в адресном пространстве какого процесса содержится эта
> структура?
Того, которосу посылается сообщение, не так ли ?
← →
Иван Шихалев © (2004-08-13 15:17) [3]
> Т.е. при обработке сообщения мы приводим lParam к типу PWindowPos
> и можем свободно читать/писать в поля этой структуры.
С какой бы это радости?
← →
Игорь Шевченко © (2004-08-13 15:18) [4]Иван Шихалев © (13.08.04 15:17) [3]
> С какой бы это радости?
Согласно документации, нет ?
← →
inic © (2004-08-13 15:20) [5]While this message is being processed, modifying any of the values in WINDOWPOS affects the window"s new size, position, or place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS.
← →
Иван Шихалев © (2004-08-13 15:21) [6]В зависимоти от сообщения запись может быть и не предусмотрена.
← →
Игорь Шевченко © (2004-08-13 15:23) [7]Иван Шихалев © (13.08.04 15:21) [6]
> В зависимоти от сообщения запись может быть и не предусмотрена.
Например ?
← →
Igorek © (2004-08-13 15:46) [8]
> Игорь Шевченко © (13.08.04 15:17) [2]
> > 1) кто выделяет/освобождает память под эту структуру?
> Никто.
> > 3) в адресном пространстве какого процесса содержится
> эта
> > структура?
> Того, которосу посылается сообщение, не так ли ?
Ну последнее логично. Тогда получается, что инфа постоянно храниться в памяти процесса, а параметр просто ссылается на нее. Тогда после обработки сообщения параметры окна переустанавливаются соотв. этой инфе.
← →
DiamondShark © (2004-08-13 15:49) [9]
> Например ?
Например, запись в поля с размерами, флагами, количеством элементов, ссылками на другие структуры...
← →
Digitman © (2004-08-13 15:54) [10]
> 1) кто выделяет/освобождает память под эту структуру?
система. а какое тебе до этого дело ? ты читай/модифицируй поля структуры, а система сама позаботится об остальном
> 2) если память потом освобождается, то как тот, кто это
> делает, узнает когда надо освободить?
источник сообщения (неважно кто) получит управление после вызова SendMessage(), после чего волен освобождать память под эту структуры ... память, разумеется, выделяется им же (источником) перед вызовом SensMessage()
> 3) в адресном пространстве какого процесса содержится эта
> структура?
в ВАП того процесса, код.поток которого создал окно, которому было адресовано сообщение WM_WINDOWPOSCHANGING
← →
Игорь Шевченко © (2004-08-13 15:59) [11]
> Тогда получается, что инфа постоянно храниться в памяти
> процесса, а параметр просто ссылается на нее. Тогда после
> обработки сообщения параметры окна переустанавливаются соотв.
> этой инфе.
Именно. Механизм такой:
В недрах ядра USER (win32k.sys) имеются процедуры. У них есть локальные переменные. Когда доходит до того, что надо вызывать пользовательский процесс (оконную процедуру), то адрес этой локальной переменной передается механизму взаимодействия с процессом пользователя. (Там создается область разделяемой памяти, копируется заданное количество байт, вызывается продура пользователя в режиме пользователя, после возврата из нее, из разделяемой памяти данные копируются обратно, разделяемая память уничтожается). С точки зрения вызывающей программы это выглядит, как передача адреса локальной переменной (в случае WindowPos).
← →
Piter © (2004-08-13 18:13) [12]Igorek © (13.08.04 15:14)
3) в адресном пространстве какого процесса содержится эта структура?
действительно смешной вопрос :)
А было бы здорово - пришло сообщение, а чтобы получить доп. параметры нужно внедрить DLL в чужое адресное пространство, чтобы там что-нибудь прочитать :)
Игорь Шевченко © (13.08.04 15:59) [11]
то есть, пока обрабатывается это сообщение система висит? Ясно, что нет. Тогда непонятно, ведь может возникнуть ситуация, что такое же сообщение надо послать другому потоку - хорошо, локальные переменные процедуры заполняются нужными данными, вызывается механизм взаимодействия с процессом пользователя... но ведь старые данные получается потеряны. И куда тогда будут скопированы данные обратно? Опять в локальные переменные? Но ведь там уже данные другого процесса. Не понимаю я
← →
Cobalt © (2004-08-14 00:18) [13]2 Piter © (13.08.04 18:13) [12]
Чё-то вы какой-то без воображения :( Если посылает (Send) - то да, висит. Только не система, а WM-часть (user32.dll, если не ошибаюсь), та, что ответствена за окна этого процесса.
Процесс-то отделён от системы. и потоки изолированны со своими стеками.
Практика - один из критериев истины. Вставьте в обработчик WM_WINDOWPOSCHANGING sleep(5000); И вы познаете истину! :)
← →
Игорь Шевченко © (2004-08-14 00:30) [14]Piter © (13.08.04 18:13) [12]
> но ведь старые данные получается потеряны. И куда тогда
> будут скопированы данные обратно? Опять в локальные переменные?
> Но ведь там уже данные другого процесса. Не понимаю я
Ты, когда процедуру вызываешь, передавая ей локальные переменные, заботишься о том, что в этот момент могут оказаться данные другого процесса ? Я думаю, что нет. Вот и Windows не заботится, ибо нафига ?
> то есть, пока обрабатывается это сообщение система висит?
> Ясно, что нет
У тебя, когда функция вызывается, вызывающая функция висит ? Ясно, что нет. Она не висит, она ждет, пока вызыванная не отработает, и управление не вернет. Вот и в Windows то же самое.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c