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

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

GlobalLock [D7, WinXP]


P@vel ©   (2004-09-15 15:44:00) 

Дело такое. Надо получить начальный адрес блока памяти. Делал так


HWND:=GlobalAlloc(GMEM_MOVEABLE,2);
HWND:=GlobalReAlloc(HWND,FSize,GMEM_MOVEABLE);
Adress:= GlobalLock(HWND);
GlobalUnlock(HWND);

HWND:=GlobalAlloc(GMEM_MOVEABLE,1);
HWND:=GlobalReAlloc(HWND,FSize,GMEM_MOVEABLE);
Adress:= GlobalLock(HWND);

В последней строке Adress становится null. А LastError показывает ошибку N157

ERROR_DISCARDED
The segment is already discarded and cannot be locked.

Можно ли получить начальный адрес не используя GlobalLock ?


Cobalt   (2004-09-15 22:00:00) [1]

2 P@vel ©   (15.09.04 17:07) [10]
> No pri etom ja vseravno polu4'al. HWND ne ravnij nil.
Любите справку - источник знаний!
dwBytes
Specifies the new size, in bytes, of the memory block. If this parameter is zero and the uFlags parameter specifies the GMEM_MOVEABLE flag, the function returns the handle of a memory object that is marked as discarded.If uFlags specifies the GMEM_MODIFY flag, this parameter is ignored.


P@vel   (2004-09-15 17:07:00) [2]

Da dejstvitel'no. FSize ravnalsa nul'u. No pri etom ja vseravno polu4'al. HWND ne ravnij nil.  Sha vse ispravil senx.


inic   (2004-09-15 16:42:00) [3]

Какое значение у FSize в этот момент ? Что говорит дебуг ?

И все-таки, ИМХО, не стоит пользоваться Address после GlobalUnlock(HWND), адрес может оказаться не актуальным .


P@vel   (2004-09-15 16:34:00) [4]


> Суслик

Большое спасибо за ссылку. Книга на шару это очент приятно. :) Сейчас почитаем.


P@vel   (2004-09-15 16:27:00) [5]


HWND:=GlobalAlloc(GMEM_MOVEABLE,2);
HWND:=GlobalReAlloc(HWND,FSize,GMEM_MOVEABLE);
Adress:= GlobalLock(HWND);
GlobalUnlock(HWND);

HWND:=GlobalAlloc(GMEM_MOVEABLE,1);
HWND:=GlobalReAlloc(HWND,FSize,GMEM_MOVEABLE);
NewAdress:= GlobalLock(HWND);
.....
{Copy Commands}
.....
Adress:=NewAdress;


Суслик   (2004-09-15 16:14:00) [6]

Т.к. ответа я на память не помню, то могу посоветовать сказать первую ссылку с http://irazin.ru/Some.htm(книга Рихтера) и прочесть 18 главу (там ровно 10 страниц).

Может поможет.
Успехов.


inic   (2004-09-15 16:13:00) [7]

И все таки, интересно, ты же значения переменных заменяешь, как тогда работать с 1ой памятью, ее даже не освободить.


P@vel   (2004-09-15 16:10:00) [8]

X3. Но сейчас всё переделывать нет желания.


Суслик   (2004-09-15 16:05:00) [9]

Зачем тебе вообще куча нужна?

Чем штатный менеджер памяти (getmem, freemem и пр) не угодил?


P@vel   (2004-09-15 16:03:00) [10]

Дело в том, что я пишу объект(типа stream). Только, что-бы при чтении, прочитанный кусок памяти удалялся. Ну так вот первые 4 строки выделяют память 10б. А в остальных выделяется память 8б. Ну и потом там соответственно всё копируется за исключением. прочитанного отрезка.


inic   (2004-09-15 15:52:00) [11]

Зачем тут первые 4 строки, от них смысла вроде никакого.

ИМХО, плохо работать с адресом анлоканной памяти.

Может FSize = 0 ?


Наверх

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