Что нового

Утечка памяти в _WinCapture

TpeTTep

Новичок
Сообщения
45
Репутация
1
Добрый вечер. Написал простенький скрипт, который делает скриншот не активного окна. Всё вроде бы работает как надо, но есть одно но. В одной из основополагающих функций имеется утечка памяти. Эта функция вызывается в цикле из-за чего потребление оперативной памяти постоянно растёт. Если саму функцию вынести за пределы цикла, то ничего подобного не наблюдается. Помогите устранить утечку пожалуйста :help:

Код:
Func _WinCapture($hWnd)
   Local $hDDC, $hCDC, $hBMP, $aPos = WinGetPos($hWnd)
   $hDDC = _WinAPI_GetDC($hWnd)
   $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
   $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $aPos[2], $aPos[3])
   _WinAPI_SelectObject($hCDC, $hBMP)
   _WinAPI_PrintWindow ($hWnd, $hCDC)
   _WinAPI_ReleaseDC($hWnd, $hDDC)
   _WinAPI_DeleteDC($hCDC)
   Return $hBMP
EndFunc

Сообщение автоматически объединено:

Кажется я уже сам нашел. После того, как вернули $hBMP и сделали с ним что хотели его нужно удалить через _WinAPI_DeleteObject($hBMP). В противном случае при вызове функции $hBMP не перезаписывается, а создаётся новый. Тут-то и происходила утечка. Тему можно считать решённой.
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Утечка не в самой функции , а в цикле, где Вы не удаляете результат её выполнения.
Как-то так :
Код:
For $i=0 to 50000
$hBitmap=_WinCapture($hWnd)
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;;
_WinAPI_DeleteObject($hBitmap)
Next

Func _WinCapture($hWnd)
   Local $hDDC, $hCDC, $hBMP, $aPos = WinGetPos($hWnd)
   $hDDC = _WinAPI_GetDC($hWnd)
   $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
   $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $aPos[2], $aPos[3])
   _WinAPI_SelectObject($hCDC, $hBMP)
   _WinAPI_PrintWindow ($hWnd, $hCDC)
   _WinAPI_ReleaseDC($hWnd, $hDDC)
   _WinAPI_DeleteDC($hCDC)
   Return $hBMP
EndFunc
 
Верх