Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: DarkMatrix en 20 Octubre 2011, 21:40 pm



Título: Memoria Insuficiente en Control
Publicado por: DarkMatrix en 20 Octubre 2011, 21:40 pm
Buenas, necesito un poco de ayuda. He detectado que este control tiene un error grave:

http://www.recursosvisualbasic.com.ar/htm/ocx-componentes-activex-dll/214-boton-checkbox-optionbutton-con-skin.htm (http://www.recursosvisualbasic.com.ar/htm/ocx-componentes-activex-dll/214-boton-checkbox-optionbutton-con-skin.htm)

Lo que sucede es que cuando el control es cargado y descargado de la memoria muchas veces, visual basic manda un error de Memoria Insuficiente, he probado varios usercontrols de botones pero ninguno manda el error como lo hace este. Lo primero que imagine fue que el control creba un DC que luego no liberaba pero creo que ese no es el problema.

Bueno a ver si pueden ayudarme a encontrar el error.

Adjunto un archivo con la prueba que hize: http://nova-digital.net/prueba.rar (http://nova-digital.net/prueba.rar)



Título: Re: Memoria Insuficiente en Control
Publicado por: BlackZeroX en 20 Octubre 2011, 21:53 pm
.
Revisa la descarga de los skins.

Dulces Lunas!¡.


Título: Re: Memoria Insuficiente en Control
Publicado por: raul338 en 21 Octubre 2011, 00:02 am
El controlo tiene código de LeandroA, y probablemente fue victima de fugas en GDI (http://www.leandroascierto.com/foro/index.php?topic=126.0) así que ... a revisar el código! :P


Título: Re: Memoria Insuficiente en Control
Publicado por: BlackZeroX en 21 Octubre 2011, 00:13 am
.
Ahora entiendo por que http://www.leandroascierto.com.ar/tips.php ya no estaba xP

Dulces Lunas!¡.


Título: Re: Memoria Insuficiente en Control
Publicado por: DarkMatrix en 21 Octubre 2011, 00:18 am
El controlo tiene código de LeandroA, y probablemente fue victima de fugas en GDI (http://www.leandroascierto.com/foro/index.php?topic=126.0) así que ... a revisar el código! :P

Algo asi me imagine, por eso aun no doy con el problema o.o


Título: Re: Memoria Insuficiente en Control
Publicado por: BlackZeroX en 21 Octubre 2011, 00:24 am
busca los SelectObject()

Se arregla haciendo algo asi:

Código
  1.  
  2. hOldhGDIObj = selectObject(hDC, hNewGDIObj)
  3. ....
  4. selectObject hDC, hOldhGDIObj
  5. DeleteObject hNewGDIObj
  6.  
  7.  

Dulces Lunas!¡.


Título: Re: Memoria Insuficiente en Control
Publicado por: DarkMatrix en 21 Octubre 2011, 00:37 am
.
Revisa la descarga de los skins.

Dulces Lunas!¡.

Segui el consejo de BlackZeroX y creo que di con el problema, busque donde se descargaba el skin que usa el control pero en ningun lado se libera el DC "hDCSkin" asi que inclui esto en el usercontrol y ahora si deja cargar todos los controles que se quiera sin saturar la memoria:

Código
  1. Private Sub UserControl_Terminate()
  2.  
  3.    Call DeleteDC(hDCSkin)
  4.  
  5. End Sub


Título: Re: Memoria Insuficiente en Control
Publicado por: BlackZeroX en 21 Octubre 2011, 00:44 am
.
acabo de revisar nuevamente el codigo para  ver las fugas de memoria sobre GDI, y si hay fugas de GDI...

por ejemplo:

Linea 966

Código
  1.  
  2.        hDCMemory = CreateCompatibleDC(0)
  3.        hBmp = CreateCompatibleBitmap(dc, lPixelWidth, lPixelHeight)
  4.        Call SelectObject(hDCMemory, hBmp)
  5.  
  6.  

En lo personal yo lo hago asi... solo elimino el original y le dejo uno nuevo...

Código
  1.  
  2. DeleteObject SelectObject(hdcMemory, hBmp)
  3.  
  4.  

Dulces Lunas!¡.