Autor Tema: Descargar una dll de memoria  (Leído 4560 veces)

0 Usuarios y 1 Visitante están viendo este tema.

rojobe55

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Descargar una dll de memoria
« en: Junio 17, 2011, 11:51:46 am »
Hola a todos, antes que nada felicitaciones por el foro y su nivel de programación, me ha dejado impresionado, sobre todo las aplicaciones de Leandro, de verdad, aunque programo en vb6 hace muchos años, nunca llegué a este nivel. Nuevamente mis respetos...

Y entonces teniendo en cuenta lo anterior, aquí va la consulta; tengo el siguiente problema:
El programa, en vb6, usa una dll con la cual achico unas imágenes, pero sucede que cada vez que se usa esta dll, el programa comienza a incrementar potencialmente el tamaño de la memoria utilizada hasta llegar a valores enormes. La consulta específica es, como puedo bajar o descargar la dll, en tiempo de ejecución, luego de utilisarla?

por ejemplo al arranque del programa xxxx.exe ...........4028kb
luego de utilizar por primera vez la dll xxxx.exe ...........7272kb
en su tercera vez    xxxx.exe ..........12764kb
en la cuarta    xxxx.exe ..........17456kb
la quinta    xxxx.exe ..........22208kb   

y así sucesivamente. Alguna idea?

Desde ya muchas gracias.
Saludos cordiales rb

xkiz ™

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 283
  • Reputación: +30/-11
    • Ver Perfil
    • xkiz ™
Re:Descargar una dll de memoria
« Respuesta #1 en: Junio 17, 2011, 03:16:53 pm »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Descargar una dll de memoria
« Respuesta #2 en: Junio 17, 2011, 05:39:16 pm »
Hola rojobe55 bienvenido al foro, lo primero hubiera que ver como se llama la dll,que tipo de dll es, si esta no tiene algún bugs que produce el incremento en la memoria,
si vos no estas llamando alguna rutina para descargar la memoria,

otras preguntas, tu programa va a correr en una versión inferior a windows xp?, utiliza imagenes que sean por ejemplo .PNG, porque de lo contrario se podría remplazar esa dll por otra

rojobe55

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Re:Descargar una dll de memoria
« Respuesta #3 en: Junio 18, 2011, 09:37:27 am »
Hola a todos, gracias por las respuestas tan rápiadas e interesantes. El problema ya está resuelto, mejor dicho no está resuelto del todo, pero estoy ajustando y probando otra alternativa que aparentemente está dando resultados positivos. Pero me gustaría contestar aunque más no sea para documentar el problema, quizás a alguien le suceda algo parecido.

La primer respuesta para xkiz. Traté de ejecutar el código que tan amablemente nos proporcionara el KPD-Team y que me haces llegar, pero mi vb6 da un error y se cuelga (preparé una imagen para ilustrar, pero no veo como insertarla).

Sin embargo, tengo una duda respecto del mismo. Veo que la carga de la dll se hace utilizando LoadLibrary, cargando una variable de tipo long, lb. La pregunta es: ¿deberé cargar la dll del problema de este modo, para poder utilizar posteriormente FreeLibrary?

Y la segunda respuesta es para el "master" LeandroA.
1 - la dll que uso es: ImageUtils.dll y la función que me daba el problema era la función ConvertBMPtoJPG.

2 - no estoy llamando a ninguna rutina para descargar la memoria, intentaré probar lo que me envía xkiz.

3 - el programita correrá en xp o +. Y como te abrás dado cuenta utilizaba la dll para convertir un BMP a JPG.

Pero: como la rutina que estaba dando problemas debía sacar una instantanea de pantalla y mandarla a un jpg, estaba haciendo algo asi:

   keybd_event vbKeySnapshot, 0&, 0&, 0& 

para luego
  SavePicture Clipboard.GetData(vbCFBitmap), theFile

al clipboard (mal no?) y como lo dejaba en bitmap, luego utilizaba la función de la dll para pasarla a jpg. Pero ahora lo estoy probando utilizando directamente otra función de la misma dll:
getDesktop   

Private Declare Function getDesktop Lib "ImageUtils.dll" _
      (ByVal strFileName As String, ByVal blnEnableOverWrite As Boolean, _
      ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal blnJpeg As Boolean, _
      ByVal JPGCompressQuality As Integer) As Integer

que permite directamente enviar la instantanea a un jpg y..... listo el pollo.

Gracias. Espero sus comentarios. Saludos cordiales. 

xkiz ™

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 283
  • Reputación: +30/-11
    • Ver Perfil
    • xkiz ™
Re:Descargar una dll de memoria
« Respuesta #4 en: Junio 18, 2011, 02:20:36 pm »
en resumen, vos lo que queres hacer es un print de la pantalla y guardarlo como .jpg?
para capturar la pantalla podes usar: keybd_event (msdn)
Capturar la imagen de la pantalla y guardarla en un fichero en disco (Recursos Visual Basic)
y para la parte de guardar como *.jpg el archivo que dejo abajo.


attachment: cJpeg.zip (17.37 KB)

« última modificación: Junio 18, 2011, 02:22:31 pm por xkiz ™ »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Descargar una dll de memoria
« Respuesta #5 en: Junio 18, 2011, 03:55:29 pm »
Hola, bien como dices que vas a correr el programa desde xp en adelante podes utilizar GDI+ con lo que no es nesesario utilizar ninguna Dll, (tambien existe clases para guardar jpg como las que te adjunto xKiz
te paso un ejemplo utilizando el protapapeles (aunque se puede evitar, pero por cuestiones de tiempo te paso esta que es un poco mas facil)
Código: [Seleccionar]
Option Explicit
Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As Long, ByVal FileName As Long, ByRef clsidEncoder As GUID, ByRef encoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GdiPlus.dll" (ByVal mHbm As Long, ByVal mhPal As Long, ByRef mBitmap As Long) As Long
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP As Long = &H2
Private Const VK_SNAPSHOT As Long = &H2C

Private Type GUID
    Data1           As Long
    Data2           As Integer
    Data3           As Integer
    Data4(0 To 7)   As Byte
End Type
 
Private Type EncoderParameter
    GUID            As GUID
    NumberOfValues  As Long
    type            As Long
    Value           As Long
End Type
 
Private Type EncoderParameters
    Count           As Long
    Parameter(15)   As EncoderParameter
End Type
 
Private Type GdiplusStartupInput
    GdiplusVersion           As Long
    DebugEventCallback       As Long
    SuppressBackgroundThread As Long
    SuppressExternalCodecs   As Long
End Type
 
 
Const ImageCodecJPG = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
Const EncoderQuality = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Const EncoderParameterValueTypeLong = 4
 
Public Function SaveSnapShopToFile(ByVal DestPath As String, Optional ByVal JPG_Quality As Long = 85) As Boolean
 
    On Error Resume Next
    Dim GDIsi As GdiplusStartupInput, gToken As Long, hBitmap As Long
    Dim tEncoder  As GUID
    Dim tParams     As EncoderParameters

    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
    DoEvents
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
   
    If Not Clipboard.GetFormat(vbCFBitmap) Then Exit Function
 
    If JPG_Quality > 100 Then JPG_Quality = 100
    If JPG_Quality < 0 Then JPG_Quality = 0

    CLSIDFromString StrPtr(ImageCodecJPG), tEncoder

    With tParams
        .Count = 1
        .Parameter(0).NumberOfValues = 1
        .Parameter(0).type = EncoderParameterValueTypeLong
        .Parameter(0).Value = VarPtr(JPG_Quality)
        CLSIDFromString StrPtr(EncoderQuality), .Parameter(0).GUID
    End With
 
    GDIsi.GdiplusVersion = 1&
 
    GdiplusStartup gToken, GDIsi
 
    If gToken Then
        If GdipCreateBitmapFromHBITMAP(Clipboard.GetData(vbCFBitmap), 0, hBitmap) = 0 Then
 
            If GdipSaveImageToFile(hBitmap, StrPtr(DestPath), tEncoder, ByVal tParams) = 0 Then
                SaveSnapShopToFile = True
            End If
 
            GdipDisposeImage hBitmap
 
        End If
 
        GdiplusShutdown gToken
    End If
 
End Function

Private Sub Form_Load()
    If SaveSnapShopToFile("C:\SnapShop.jpg", 80) Then
        MsgBox "Correcto!!! (dijo Susana Gimenes)"
    End If
End Sub

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Descargar una dll de memoria
« Respuesta #6 en: Junio 18, 2011, 08:34:36 pm »
No tengo nada importante que agregar, pero si tienes XP y citándote esto:
... (preparé una imagen para ilustrar, pero no veo como insertarla). ...
Te recomendaria le das una checada a este post , ve hasta el final del post para checar el video.
Me encuentras en YAcosta.com

rojobe55

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Re:Descargar una dll de memoria
« Respuesta #7 en: Junio 20, 2011, 12:13:41 pm »
Hola, he tardado unos días en responder porque todavía estoy "digiriendo" lo que me han dicho.

Todas las soluciones son excelentes y si bien he reemplazado la famosa dll por la GDI+ que me recomienda LeandroA, la cual estoy estudiando y aprendiendo, no he dejado de probar (aún estoy en eso también) lo que me recomienda xkiz.

También en el próximo tema que tenga que incluir una imagen seguiré las recomendaicones de YAcosta y su polémico vidéo.

Gracias a todos, he resuelto de manera eficiente el problema, quedó "chiche", rápido, boito y lo principal, YA NO CRECE!!...   :D