Hello Subscribe.Ru,
Sunday, May 31, 2004, 5:18:21 PM, you wrote:
| SRПрп> Ответ получается из двух предположений: SRПрп> 1. поскольку программа в первом случае валится, скорее всего, hSomeListView |
-
| SRПрп> дескриптор окна другого процесса (об этом уже SRПрп> упомянул "Victor Vakchturov"); SRПрп> вероятность совпадения адресов стека в адресных пространствах SRПрп> двух процессов ничтожна SRПрп> 2. во втором случае в параметре VirtualAlloc передана немного неожиданная SRПрп> комбинация флагов: 0x8000000 это SEC_COMMIT, используемый при SRПрп> создании области разделяемой памяти, но явного указания на то, что SRПрп> этот флаг можно использовать для VirtualAlloc мне не удалось найти; SRПрп> можно посмотреть на полученное значение адреса, чтобы SRПрп> убедиться, что выделена именно разделяемая память |
Вопрос 1: hSomeListView - хендл, принадлежащий чужому процессу.
Если я работаю с чужим хендлом, разве COMCTL32.dll будет падать?
Почему???
Вопрос 2: Почему с указателем на выделенную память с magic аттрибутом
работает, а с указателем на статическую переменную не идет?
Все писал под WinME на VS 6.0
Не спорю, дескрипторы окон разделяются между процессами.
И до тех пор, пока в параметрах сообщений нет указателей, все будет работать.
Но если в сообщении есть указатель на область памяти в одном процессе,
а окно создано в другом - при попытке обработать сообщение будет
ошибка, поскольку адресные пространства процессов в Win32
раздельные и обращение будет выполнено не поймешь куда.
Из этого правила есть исключения, например WM_COPY.
В других случаях, чтобы передать сообщения с указателями
между процессами, идут на различные ухищрения,
одно из которых и было в примере.
Чтобы послать сообщение с указателем в приведенном примере пытаются
добиться, чтобы адрес области памяти в вызывающем процессе был
одинаковым с адресом в вызываемом и доступ к этой памяти был
у обоих процессов. Для этого создается область разделяемой
памяти, хотя такого способа, повторюсь, я в документации
не видел. С обычной переменной это не
пройдет - смотри выше.
Под Win9x/WinME такой финт ушами проходит, а вот на WinNT,
насколько я помню, не гарантируется, что адреса разделяемой
памяти в разных процессах будут одинаковы.
Можно будет уточнить у Рихтера.
--
Номер выпуска : 3260
Возраст листа : 267 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/170075
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru