Что нового

DLL и утечка памяти

joker2d

Новичок
Сообщения
182
Репутация
0
Использую DLL на c++ для распознования картинок вызов делаю так

Код:
$DLLHandle = DllOpen("img.dll")
				$InitValue = DllCall($DLLHandle, "UINT64:cdecl", "Init")
				Sleep(1000)
				Local $result2 = DllCall($DLLHandle, "PTR:cdecl", "HWNDToPBitmap", "HWND", $hwnd, "int", $count_svetov)
				If IsPtr($result2[0]) Then
					DllCall($DLLHandle, "PTR:cdecl", "PBitmapToFile", "PTR", $result2[0], "Wstr", $papka_for_screen )
				EndIf	
				DllCall($DLLHandle, "int:cdecl", "DeletePBitmap", "PTR", $result2[0])
				DllCall($DLLHandle, "void:cdecl", "Shutdown", "UINT64:cdecl", $InitValue[0]);
				DllClose($DLLHandle)


в процессе использования идет постоянное увеличение используемой памяти причем не самим скриптом, а чем то что в диспечере задач даже не отображаеться, видимо это dll
по коду я его загружаю и выгружаю, почему же память не освобождается ?
в самом коде длл так же память чиститься
может в autoit коде что то забыл добавить чтобы память освобождать ?

пробовал один раз загрузить длл
Код:
$DLLHandle = DllOpen("img.dll")

и потом просто к ней обращаться (то есть без вызова DllClose) ничего не меняется память уменьшается точно так же.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проблема, скорее, в самой библиотеке.
возможно и в самом коде. приведен только кусок. может быть где то не закрыты дескрипторы и прочее
 
Автор
J

joker2d

Новичок
Сообщения
182
Репутация
0
это весь код, ну еще сам бесконечный цикл и вывод логов в консоль
я специально выделил этот кусок в отдельный скрипт чтобы проверить, отъедает память именно он

что за дескрипторы можно пример, попробую вставить и погонять тесты


вот полный код

Код:
$count_svetov=4
$hwnd=HWnd("0x000000000002037E")
$papka_for_screen="C:\screen\test.bmp"

while 1
WinSetState($hwnd, "", @SW_SHOW)
				Sleep(1000)
				WinActivate($hwnd)
				Sleep(1000)



ConsoleWrite("Screen START1" & @CRLF)
$DLLHandle = DllOpen("img.dll")
				$InitValue = DllCall($DLLHandle, "UINT64:cdecl", "Init")
				Sleep(1000)
				Local $result2 = DllCall($DLLHandle, "PTR:cdecl", "HWNDToPBitmap", "HWND", $hwnd, "int", $count_svetov)
				If IsPtr($result2[0]) Then
					DllCall($DLLHandle, "PTR:cdecl", "PBitmapToFile", "PTR", $result2[0], "Wstr", $papka_for_screen )
					ConsoleWrite("Screen START2" & @CRLF)
				EndIf
				;ConsoleWrite("$InitValue[0]="&$InitValue[0]& @CRLF)
				DllCall($DLLHandle, "int:cdecl", "DeletePBitmap", "PTR", $result2[0])
				DllCall($DLLHandle, "void:cdecl", "Shutdown", "UINT64:cdecl", $InitValue[0]);
				ConsoleWrite("Screen END1" & @CRLF)
				DllClose($DLLHandle)

$time = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN
$mem = MemGetStats()
ConsoleWrite($time&" Физическая память: свободно "&$mem[2] & @CRLF)
Sleep(10000)
wend
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Можно обратиться к разработчику библиотеки.
в коде я не вижу ничего такого, чтобы съедало память. даже больше скажу, открытие библиотеки можно вынести перед циклом, а закрытие делать при выходе
проверить не могу, нет такой библиотеки
 
Автор
J

joker2d

Новичок
Сообщения
182
Репутация
0
Понятно значит проблема не в аутоит
Наверно буду делать вызов скриншота из внешнего exe c помощью RunAsWait и прописывать хендл окна в тхт чтобы exe его прочитал

А в аутоит кроме
_ScreenCapture_CaptureWnd
нельзя ничем сделать скрин ? нужно чтобы скрин был маленького размера с чернобелыми цветами, в _ScreenCapture_CaptureWnd нельзя установить количество цветов
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
joker2d, что вам мешает не сохранять скриншот в файл, а работать с полученным битмапом с помощью GDI+?

Пример
Код:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

Run("notepad.exe")
Local $hWnd = WinWaitActive("[CLASS:Notepad]"), $sFile = @ScriptDir & "\Test.png"
_GDIPlus_Startup()

Local $hHBMP = _ScreenCapture_CaptureWnd("", $hWnd)
Local $hBMP = _GDIPlus_BitmapCreateFromHBITMAP($hHBMP)
_WinAPI_DeleteObject($hHBMP)
Local $iW = _GDIPlus_ImageGetWidth($hBMP), $iH = _GDIPlus_ImageGetHeight($hBMP)

Local $hIA = _GDIPlus_ImageAttributesCreate()
Local $tColorMatrix = _GDIPlus_ColorMatrixCreateGrayScale()
_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)

Local $hResizeBMP = _GDIPlus_BitmapCreateFromScan0($iW / 2, $iH / 2, $GDIP_PXF08INDEXED)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hResizeBMP)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBMP, 0, 0, $iW, $iH, 0, 0, $iW / 2, $iH / 2, $hIA)
_GDIPlus_ImageSaveToFile($hResizeBMP, $sFile)

_GDIPlus_ImageDispose($hBMP)
_GDIPlus_ImageDispose($hResizeBMP)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()
WinClose($hWnd)
ShellExecute($sFile)
 
Верх