Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как этот код работает (GlobalAlloc)


Darkwingg ©   (2007-08-30 08:57:00) 

вот, на этом форуме нашел код:


Var
 j: Cardinal;
 buf   : pointer;
 s: shortstring;
begin
 buf := Ptr(GlobalAlloc(GMEM_FIXED,j));
 ...
 GetFileVersionInfo(@s[1], 0, j, buf);
 ...
 GlobalFree(Cardinal(buf));
end;


вот что увидел в справке по GlobalAlloc:
Return Values
If the function succeeds, the return value is the handleof the newly allocated memory object.

то есть bufэто указатель на хендл????, но ведь
GetFileVersionInfoнеобходим указатель на буфер:
pData
    Pointer to a bufferto receive file-version information.

Но ведь размещение в памяти объекта системы (буфера) не совпадает с размещением его хэндла.

Поясните пожалста, как так оно работает.


DVM   (2007-08-30 20:47:00) [1]


> Darkwingg   (30.08.07 10:16) [11]

Этот код странноват конечно немного, но рабочий. Не я его писал, я сам другим пользуюсь, просто этот оказался самым коротким примером использования GetFileVersionInfo().

А этот код он кажется из KOL, судя по shortstring.


Darkwingg   (2007-08-30 10:16:00) [2]


> Ну а что, указктельн не может быть одновременно и хендолм?
>  Непонимаю что здесь непонятного.


Почему то в голове сложилось мнение, что хендл - некий ID который система назначает своим объектам, типа порядкового номера, который не несет осбого смыла, кроме придания уникальности.

А в общем, ему канеш ничто не мешает быть и адресом.


Darkwingg   (2007-08-30 10:08:00) [3]


> Сергей М. ©   (30.08.07 09:59) [9]


спасибо очень. ;)


Сергей М.   (2007-08-30 09:59:00) [4]


> Darkwingg   (30.08.07 09:49) [7]


Видишь ли, случаев, когда хэндл объекта являет собой ничто иное как указатель на сам объект, в Win32 не так уж и мало.

Простейший пример - LoadLibrary возвращает хэндл загруженного PE-модуля ( HINSTANCE), который есть ничто иное как базовый адрес образа этого модуля в адресном пространстве загрузившего его процесса.
Поэтому к этому INSTANCE-значению можно смело обращаться как к Pointer-значению.


homm   (2007-08-30 09:51:00) [5]

> ))) ок. просто интересно как работает, коль уж такой код
> некто PVM (c)написал.

Ну а что, указктельн не может быть одновременно и хендолм? Непонимаю что здесь непонятного.


Darkwingg   (2007-08-30 09:49:00) [6]


> Выдели ту же самую память с пом. обычной GetMem и не заморачивайся
> - все будет работать чудесным образом.


))) ок. просто интересно как работает, коль уж такой код некто PVM (c)написал.


Сергей М.   (2007-08-30 09:44:00) [7]


> Darkwingg   (30.08.07 09:41) [5]


Ради чего ты затеял бодягу с GlobalAlloc и иже с ней ?

Выдели ту же самую память с пом. обычной GetMem и не заморачивайся - все будет работать чудесным образом.


Darkwingg   (2007-08-30 09:41:00) [8]

вот щас посмотрел GlabalFree:

hMem
Identifies the global memory object. This handleis returned by either the GlobalAlloc or GlobalReAlloc function.

Ей нужен хендл, а не указатель... как тогда на его принимает?

Или, по какой-то причине, в случае с памятью и всякими Alloc'ами вместо хендлов указываются адреса?


homm   (2007-08-30 09:35:00) [9]

> [3] Сергей М. ©   (30.08.07 09:33)
> Следует поступать так как это рекомендует MS.

Да я не спорю, просто дурят нас как хоят :)


Сергей М.   (2007-08-30 09:33:00) [10]


> homm ©   (30.08.07 09:29) [2]


Реализовано или не реализовано - не нам рассуждать.
Следует поступать так как это рекомендует MS.

И в Борланде, согласись, тоже не дураки сидят, судя по использованию им GlobalLock при GMEM_MOVEABLE (см., например, TClipboard.SetBuffer)


homm   (2007-08-30 09:29:00) [11]

> [1] Сергей М. ©   (30.08.07 09:14)

Только это все в виндовс не реаизовано, нет никокой GMEM_MOVEABLE, GlobalLock в дебагере даже в XP тупо возвращает переданое ий значение, без единого условного перехода.


Сергей М.   (2007-08-30 09:14:00) [12]


> то есть buf это указатель на хендл?


Нет, buf - это сам указатель (только для случая GMEM_FIXED, иначе указатель должен быть получен с пом. GlobalLock(параметр-хэндл, полученный в рез-те вызова GlobalAlloc)).


Наверх

Титульная страница Поиск, карта сайта Написать письмо