Что нового

Где найти extended-коды для _GDIPlus_BitmapCreateHBITMAPFromBitmap?

iltmpz

Новичок
Сообщения
23
Репутация
0
Приветствую участников форума!

Столкнулся я с проблемой: в процессе разработки относительно большого проекта, в одной из функций вызываю чтение bmp-файла. И чаще всего эта функция отрабатывает без проблем.
Но иногда, начиная с некоторого момента (обычно часов через 5 непрерывной работы скрипта) функция начинает возвращать ошибку.

Вот фрагмент кода:
Код:
Local $hBmp = _GDIPlus_BitmapCreateFromFile($imageDir & '\' & $fileName)
If $hBmp = 0 Then
    Exit
EndIf
Local $hImg = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
If @error Then
    LogDbg("_GDIPlus_BitmapCreateHBITMAPFromBitmap failed, extended code: "&@extended)
    Exit
EndIf

LogDbg это просто обертка для ConsoleWrite, которая также пишет лог в файл.

И вот, функция _GDIPlus_BitmapCreateHBITMAPFromBitmap, на протяжении часов работающая идеально, вдруг начинает возвращать 0 и устанавливать @error.
Почитав справку, нашел, что "@extended may contain GPSTATUS error code ($GPID_ERR*)". После чего, собственно, добавил этот @extended в код.
Сегодня скрипт в очередной раз упал, выдав при этом: extended code: 7.
Как мне понять, что такое код 7, какие еще коды бывают и что делать?
GPSTATUS и $GPID_ERR гуглил, ничего внятного не нашел. GdipCreateHBITMAPFromBitmap тоже смотрел, нашел только ссылку на некие Bitmap Functions на сайте Microsoft. Про коды ошибок - ни слова нет.
 
Автор
I

iltmpz

Новичок
Сообщения
23
Репутация
0
Alofa сказал(а):
OffTopic:

Надеюсь "Remarks" тоже прочитали?
Да, а причем тут моя тема?
Remarks

When you are done with the Bitmap object, call _WinAPI_DeleteObject() to release the resources.
Если Вы имеете в виду, что надо освобождать ресурсы, то в конце своей функции я это делаю:
Код:
_GDIPlus_BitmapDispose($hBmp)
	_WinAPI_DeleteObject($hImg)

Хотя грешу на утечки памяти в проекте, хотя как отлавливать их - понятия не имею...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот эти функции получше будут чем загадочный @extended
Код:
_WinAPI_GetLastError ( )
_WinAPI_GetLastErrorMessage ( )
_WinAPI_GetErrorMessage
_WinAPI_ShowLastError
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
iltmpz
грешу на утечки памяти в проекте
И правильно делаете. Вот пример кода
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()

$hBmp = _GDIPlus_BitmapCreateFromFile("test.bmp")
If $hBmp = 0 Then Exit

For $i = 0 To 10000
  $hImg = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
  If @error Then
    ConsoleWrite($i & ":" & @error & ":" & @extended & @CRLF)
    ExitLoop
  EndIf
  ; _WinAPI_DeleteObject($hImg)
Next

_GDIPlus_Shutdown()
У меня на Win7 x86 ошибка возникает примерно в районе 7865. Теперь раскомментируем функцию удаления объекта и убедимся, что ошибки нет. Далее добавляем в цикл создание любого GDI объекта, например кисти
Код:
For $i = 0 To 10000
  $hBrush = _WinAPI_CreateSolidBrush(0x000000)
  $hImg = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
  If @error Then
    ConsoleWrite($i & ":" & @error & ":" & @extended & @CRLF)
    ExitLoop
  EndIf
  _WinAPI_DeleteObject($hImg)
Next
В результате ошибка возникает на 9957 итерации и как раз с кодом @extended = 7. Другими словами, с большой долей вероятности проблема у вас именно в утечке GDI объектов.

как отлавливать их
Поиск утечки GDI объектов: Как загнать мастодонта
 
Автор
I

iltmpz

Новичок
Сообщения
23
Репутация
0
inververs сказал(а):
Вот эти функции получше будут чем загадочный @extended
О, спасибо, то что я искал!
Добавил, в следующий раз как повторится ошибка, буду смотреть результат.

InnI сказал(а):
В результате ошибка возникает на 9957 итерации и как раз с кодом @extended = 7. Другими словами, с большой долей вероятности проблема у вас именно в утечке GDI объектов.

как отлавливать их
Большое спасибо за статью, действительно, не представлял себе такой метод. Ваш пример понятен, первое что я проверил - что в пределах этой функции создаваемые объекты обязательно удаляются. Никакие ExitLoop или Return не располагаются между ...Create... и ...Delete/Dispose... И вообще везде удаляются, вроде... Буду копать.
 
Верх