Меню сайта
Мини-чат
Чтобы добавить сообщение, необходимо авторизоваться.
Главная » Статьи » Не стандартные примеры на Delphi » Pascal

Как работать с блоками памяти размером более 64K?
Nomadic советует:

Так можно помещать в один блок памяти записи из TList (TCollection):


    imlementation
{ To use the value of AHIncr, use Ofs(AHIncr). }
procedure AHIncr; far; external 'KERNEL' index 114;

const
NEXT_SELECTOR: string[13] = 'NEXT_SELECTOR';

function WriteData: THandle;
var
DataPtr: PChar;
i: Integer;
begin
Result := GlobalAlloc(GMEM_SHARE or GMEM_ZEROINIT, {pазмеp большого блока});
if Result = 0 then Exit;

DataPtr := GlobalLock(Result);

{записываем кол-во эл-тов}
Inc(DataPtr, {pазмеp счетчика эл-тов})

for i := 0 to {некий}Count-1 do
begin
if
LongInt(PtrRec(DataPtr).Ofs) + {pазмеp подблока} >l= $FFFF then
begin

Move(NEXT_SELECTOR, DataPtr^, SizeOf(NEXT_SELECTOR)); {некая константа}
{ коppекция сегмента }
PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
Inc(DataPtr, {pазмеp нового блока});
end; { for i }
GlobalUnlock(Result);
end;

procedure ReadData(DataHdl: THandle);
var
DataPtr : PObjectCfgRec;
RecsCount: Integer;
i: Integer;
begin
if
DataHdl = 0 then Exit;
DataPtr := GlobalLock(DataHdl);
RecsCount := PInteger(DataPtr)^;
Inc(PInteger(DataPtr));
for i := 1 to RecsCount do
begin

{ обpаботать данные }
Inc(DataPtr);
if PString(DataPtr)^ = NEXT_SELECTOR then
begin

PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
end; { for i }
GlobalUnlock(DataHdl);
end
Категория: Pascal | Добавил: DelphiAiX (09.05.2012)
Просмотров: 479 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]