Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос о адресном пространстве.   Найти похожие ветки 

 
Демонов Е.В.   (2002-11-26 05:36) [0]

Такой вопрос возник у меня когда я разбирался с работой с буфером обмена через API.

H:=GetClipboardData;
p:=GlobalLock(h);

//Работаем с p

ClobalUnlock(h);

Так вот не совсем понятно - Информация в буфере обмена находится вне адресного пространства моего процесса. А потом я получаю указатель p и работаю с ним - значит уже в моём адресном постранстве - Так вот не понятно или GetClipboardData перемещает данные буфера обмена в адресное пространство моего ппроцесса или GlobalLock ?

И второй вопрос - Функция GlobalAlloc выделяет память в адресном пространстве вызывающего её процесса или ?

P.S:Могут быть неточночти в названиях функций ну смысел понятен.


 
Демонов Е.В.   (2002-11-26 06:31) [1]

Мастера !?!?!?!?!?!?


 
Юрий Зотов   (2002-11-26 09:21) [2]

По всей видимости, при таких операциях система использует некую разделяемую память (memory mapped file с 0xFFFFFFFF), а наша программа просто получает доступ к ней путем ее отображения на адресное пространство программы.

По поводу GlobalAlloc:
The GlobalAlloc function allocates the specified number of bytes from the heap. In the linear Win32 API environment, there is no difference between the local heap and the global heap .


 
Демонов Е.В.   (2002-11-26 10:06) [3]

>>По поводу GlobalAlloc:
Ответьте - Да или Нет.
ClobalAlloc - Выделяет память в адресном пространстве вызывающего её процесса ?


 
Игорь Шевченко   (2002-11-26 12:15) [4]


> ClobalAlloc - Выделяет память в адресном пространстве вызывающего
> её процесса ?


Да


 
Юрий Зотов   (2002-11-26 13:01) [5]

> Демонов Е.В. © (26.11.02 10:06)

Ну сами прикиньте, что может означать фраза:
In the linear Win32 API environment, there is no difference between the local heap and the global heap.

В Win32 используются 32-битные адреса. Такой адрес может иметь значение от 0 до 4-х Gb (меньше 0 не бывает, а больше 4-х Gb просто не умещается в 32-х битах).

И адресное пространство процесса - тоже 4 Gb, ни больше, ни меньше. Стало быть, ЛЮБОЙ адрес внутри процесса может относиться ТОЛЬКО к его собственному адресному пространству, и ни к какому другому.

А для организации межпроцессного взаимодействия система использует специальные механизмы. Сам процесс все равно работает с адресом в своем пространстве, но система обеспечивает проецирование этого адреса на некую область за пределами этого пространства (точнее, конечно, наоборот).

Поэтому любая функция, возвращающая АДРЕС, всегда возвращает его именно в контексте вызвавшего ее процесса. А уж с чем там этот адрес на самом деле связан - это процессу до лампочки, он работает со СВОИМ адресом, вот и все. С ЧУЖИМ он работать просто не может.

Потому и нет разницы между local и global хипами. Точнее, global хипа для процесса как бы просто не существует. С другой стороны, можно сказать и наоборот, что для процесса не существует local хипа. То есть, у процесса только одна память - она же local, она же global. И вся она - его собственная. Ни про какие другие "памяти" ему ничего не известно - как раз потому, что ему выделяется максимальное количество памяти, которое в принципе может быть адресовано.

Ну, вот, на пальцах примерно так.


 
Victor_Cr   (2002-11-26 13:12) [6]

2 Демонов Е.В. © (26.11.02 10:06)
На всякий случай добавлю. Это совсем не означает что твое приложение будет больше памяти кушать. В памяти всегда будет только один буфер обмена сколько раз бы ты не делал GlobalAlloc. Практически полная аналогия с ДЛЛ-ками. Однократно загруженый код многократно отображается различным процессам.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-37344
Сатир
2002-12-21 21:04
2003.01.13
А кто бреет бороду?


14-37381
Lokk
2002-12-25 13:30
2003.01.13
Помогите плиз


1-37007
Delphi Maniak
2003-01-01 10:13
2003.01.13
Вопрос про реестр


1-37077
Alexsandr (GEG)
2003-01-03 13:17
2003.01.13
StringGrid убрать выделение ячейки


3-36996
Влад2
2002-12-18 13:01
2003.01.13
Сбой реструктуризации при попытке открытия таблицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский