Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Проблема с указателями в WinAPI

Как я понял, когда я передаю указатель на статическую переменную,
/*
POINT pt;
ListView_GetItemPosition(hSomeListView, index, &pt);
*/
компилятор кладет в стек только смещение ее в адресном пространстве
процесса.

Когда я передаю через переменную (выделенную мною), содержащую
указатель и смещение в нем,
/*
POINT *ppt;
//выделяем память для ppt...
ListView_GetItemPosition(hSomeListView, index, ppt);
*/
все работает. Похоже, если я выделяю
разделяемую память, это заставляет ось возвращать вместе со
со смещением и ее дескриптор, чтобы и другие процессы
могли обратиться к ней.
Так ли это???????

P.S. К то му же, в help'e написано
BOOL ListView_GetItemPosition(HWND hwnd,int i,POINT FAR *ppt);
Не просто POINT *ppt, а POINT FAR *ppt

Ответить   Cyberbob Tue, 15 Jun 2004 22:30:01 +0400 (#170734)

 

Ответы:

Мда-а-а. Боюсь, с теорией пока не очень. Не обижайся пожалуйста.
Было бы хорошо на досуге почитать какую-нибудь книгу об архитектуре
процессоров x86 (раз уж они так распространены).
Плюс что-нибудь о реализации Win32, желательно на русском,
чтобы лучше отложилось в памяти. Может кто-нибудь
посоветует тебе подходящий ресурс в сети.
Но если уж взялся отвечать, продолжу.

Win32 использует "плоскую" модель памяти - все адреса внутри процессов
представляют собой 32-битные смещения. Очень удобно. Объявление
"POINT pt" в функции заставляет компилятор распределить в стеке
фрагмент памяти нужного размера. Выражение "&pt" в вызове
функции заставляет компилятор поместить в стек
32-битный адрес в стеке для структуры "pt".

Нет, не так. Повторюсь - адреса внутри процесса 32-битные. То, что
выделяется разделяемая между процессами память этого правила
не отменяет. Операционка отображает одну и ту же область
памяти на адресные пространства нескольких процессов.
Но в твоем случае приходится полагаться на то, что адрес
этой разделяемой памяти окажется одинаковым
для всех процессов.

О "FAR" в Win32 можно забыть - она определена пустой и
была нужна в 16-битной Windows, в которой
использовались адреса вида
селектор:смещение.

--
Номер выпуска : 3269
Возраст листа : 268 (дней)
Количество подписчиков : 420
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/170844
Получить правила : 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

Ответить   Wed, 16 Jun 2004 10:16:46 +0400 (#170844)