Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: rojobe55 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
-
msdn: FreeLibrary (http://msdn.microsoft.com/en-us/library/ms683152(v=vs.85).aspx)
Ej: FreeLibrary (http://allapi.mentalis.org/apilist/BFE74A1901430F2637D60129E2B3C775.html)
-
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
-
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.
-
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 (http://msdn.microsoft.com/en-us/library/ms646304%28v=vs.85%29.aspx) (msdn)
Capturar la imagen de la pantalla y guardarla en un fichero en disco (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/65.htm) (Recursos Visual Basic)
y para la parte de guardar como *.jpg el archivo que dejo abajo.
(http://www.bolsafinanceira.com/images/attachment.gif) attachment: (http://public.blu.livefilestore.com/y1p6rzV7fc2dhXygkvQzXMODtsEkMJsfK0INohFmvCT-jxUk1MV6hvwkl2K4VUaFnX_ghorPkmfJxv_DIfAiekh6A/zip.png) cJpeg.zip (http://www.mediafire.com/?3rc9d36a565auwk) (17.37 KB)
-
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)
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
-
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 (http://www.leandroascierto.com.ar/foro/index.php?topic=938.0) , ve hasta el final del post para checar el video.
-
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