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

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

Проблема с переполнением памяти


TkN ©   (2006-12-12 19:02:00) 

Есть фунция конвертации с png в ico файл. При многократном вызове функции, происходит ошибка. Думаю что наверно переполнение памяти.

Ошибка происходит в этом месте  

hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0);

Просто при выполнении этой строки происходит выдиление некой области памяти.  При завершении фунции область не очищается.
Может есть какие-то мысли?
Вот код:

//Функция которая преобразовывает png в ico и возвр. результат HICON
function PNGtoIcon(   str : string;
                     ACursor : Boolean = false;
                     AHotSpotX : Integer = 0;
                     AHotSpotY : Integer = 0) : HICON;
var
 APNG : TPNGObject;
 Width, Height : Integer;
 BitmapHeader  : PBitmapV5Header;
 hNewBitmap, hMonoBitmap   : HBITMAP;
 Bits          : Pointer;
 x, y          : Integer;
 DC            : HDC;
 IconInfo      : _ICONINFO;
 Pixel         : ^Integer;
 ScanLine      : PRGBTriple;
 AlphaScanline : pByteArray;
begin

 APNG := TPNGObject.Create;

 APNG.LoadFromFile(str);
 Width := APNG.Width;
 Height := APNG.Height;
 New(BitmapHeader);
 BitmapHeader.bV5Size := sizeof(BITMAPV5HEADER);
 BitmapHeader.bV5Width := Width;
 BitmapHeader.bV5Height := -Height;
 BitmapHeader.bV5Planes := 1;
 BitmapHeader.bV5BitCount := 32;
 BitmapHeader.bV5Compression := BI_BITFIELDS;
 BitmapHeader.bV5RedMask := $00FF0000;
 BitmapHeader.bV5GreenMask := $0000FF00;
 BitmapHeader.bV5BlueMask := $000000FF;
 BitmapHeader.bV5AlphaMask := $FF000000;

 DC := GetDC(0);
 hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0);
 Dispose(BitmapHeader);
 ReleaseDC(0,dc);
 hMonoBitmap:=CreateBitmap(Width,Height,1,1,nil);

 Pixel := Bits;
 for y := 0 to Height-1 do
 begin
   ScanLine := APNG.Scanline[y];
   AlphaScanline := APNG.AlphaScanline[y];
   for x := 0 to Width - 1 do
   begin

     Pixel^ := AlphaScanLine[x];
     Pixel^ := Pixel^ shl 8;
     Inc(Pixel^, Scanline^.rgbtRed);
     Pixel^ := Pixel^ shl 8;
     Inc(Pixel^, Scanline^.rgbtGreen);
     Pixel^ := Pixel^ shl 8;

     Inc(Pixel^, Scanline^.rgbtBlue);
     Inc(Pixel);
     Inc(ScanLine);
   end;
 end;

 IconInfo.fIcon := not ACursor;
 if ACursor then
 begin

   IconInfo.xHotspot := AHotSpotX;
   IconInfo.yHotspot := AHotSpotY;
 end;

 IconInfo.hbmMask := hMonoBitmap;
 IconInfo.hbmColor := hNewBitmap;
 Result := CreateIconIndirect(IconInfo);
 DeleteObject(hNewBitmap);
 DeleteObject(hMonoBitmap);

 APNG.Free;
end;


TkN   (2006-12-17 13:09:00) [1]


> А CreateDIBSection это виндовая функция???


Функция CreateDIBSection создает аппаратно-независимый растровый формат (DIB), который приложения могут записывать непосредственно. Функция дает Вам указатель на расположение значений битов растра. Вы можете поставить дескриптор объекта "проекция файла в память", который функция использует для создания точечного рисунка, или Вы можете дать возможность системе выделить память для него.


Stexen   (2006-12-17 01:31:00) [2]


> при чем выбивает по разному, при приминении одного цикла
> например, может выдать один раз на 5, второй - на 10

Хм... странные какие то проблеммы...
У меня было что то подобное, честно говоря, не помню как решил данную проблему.

А CreateDIBSection это виндовая функция???


TkN   (2006-12-16 16:54:00) [3]

divizion by zero
при чем выбивает по разному, при приминении одного цикла
например, может выдать один раз на 5, второй - на 10


Stexen   (2006-12-16 05:02:00) [4]


> DeleteObject(hNewBitmap);

Упс, сори, вроде что то похожее на освобождение памяти...
А какая хоть ошибка то?


Stexen   (2006-12-16 04:58:00) [5]


>
> Может я что-то туплю, можно по подробней. Какие выводы?

Хендлер наверное закрывать надо...


TkN   (2006-12-13 19:14:00) [6]


> grisme ©   (12.12.06 20:57) [1]
> чем является возвращаемое значение функции CreateDIBSection()?
>  выводы?

Может я что-то туплю, можно по подробней. Какие выводы?


grisme   (2006-12-12 20:57:00) [7]

чем является возвращаемое значение функции CreateDIBSection()? выводы?


Наверх

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