Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.27;
Скачать: CL | DM;

Вниз

Как этот код работает (GlobalAlloc)   Найти похожие ветки 

 
Darkwingg   (2007-08-30 08:57) [0]

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


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 handle of the newly allocated memory object.

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

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

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


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


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


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


 
homm ©   (2007-08-30 09:29) [2]

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

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


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


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


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

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


 
homm ©   (2007-08-30 09:35) [4]

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

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


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

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

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

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

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


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


> Darkwingg   (30.08.07 09:41) [5]


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

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


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


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


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


 
homm ©   (2007-08-30 09:51) [8]

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

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


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


> Darkwingg   (30.08.07 09:49) [7]


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

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


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


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


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


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


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


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

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


 
DVM ©   (2007-08-30 20:47) [12]


> Darkwingg   (30.08.07 10:16) [11]

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

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



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

Текущий архив: 2008.04.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
2-1207311044
TCrash
2008-04-04 16:10
2008.04.27
Размеры меню


15-1205171023
NaRuTo
2008-03-10 20:43
2008.04.27
www.keygen.ru


15-1205652355
Kolan
2008-03-16 10:25
2008.04.27
Откуда взялись дерективы WARN в верху модуля?


15-1205015585
Германн
2008-03-09 01:33
2008.04.27
Всё уже украдено, до нас.


15-1205499532
[fs] BandQ
2008-03-14 15:58
2008.04.27
Хочу поделиться наработками (исходники)