Текущий архив: 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