Visual Basic 6.0 se cierra sin motivo

Iniciado por keef, 2 Enero 2021, 23:14 PM

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

keef

Hola.

Desde hace unos 2 meses que vengo experimentando un problema, que no me deja probar el código que escribo en VB en ciertas ocasiones.

Pero el problema no tiene relación con el lenguaje o la programación, sino con que a veces,
cuando me dirijo a ejecutar el código escrito por mí, la aplicación se cierra sola de manera violenta.

He notado que esto solo pasa cuando uso ciertas APIs en el código; Estas APIs las probé en un VB6 instalado en Windows 7 y el problema desaparece, pero yo necesito la aplicación funcional en Windows 10, que es el sistema desde el que escribo ahora y en el que se me presenta este problema.

Busqué en Google mi caso, el cual no es tan singular, hay varias personas preguntando lo mismo, pero en el caso de estas, se cierra en otros momentos y bajo otras condiciones, como al abrir un formulario, al compilar, etc.

Agradezco cualquier información que me ayude a averiguar el porqué de este problema, que cuando me apareció por primera vez, me sorprendió bastante, puesto que nunca he tenido problemas de este estilo.

Uso Windows 10 de 64 bits y, como VB6 está disponible solamente para sistemas 32 bits con algo de antigüedad, tuve que hacer algunos cambios en la carpeta raíz del programa para instalarlo de manera exitosa.

Gracias y saludos. :rolleyes:

EdePC

Has leído los detalles del mensaje de error? normalmente ahí dice el exe o dll que causó el error. También se guardan estos detalles en el Visor de Eventos > Registros de Windows > Aplicación

Lo primero que pensaría es Incompatibilidad de DLL, si estás usando una DLL que no es del propio instalador de Visual Basic es posible que Win10 tenga la versión más reciente y el VB sea de una versión anterior.

Si te es posible puedes subir una muestra de un proyecto muy simple que de ese error, para intentar replicarlo, ver su cola de llamadas y archivos cargados para detectar el problema.

keef

Cita de: EdePC en  3 Enero 2021, 20:30 PM
Lo primero que pensaría es Incompatibilidad de DLL, si estás usando una DLL que no es del propio instalador de Visual Basic es posible que Win10 tenga la versión más reciente y el VB sea de una versión anterior.

Hasta donde sé, solo uso las DLL que se instalan con el VB, aunque es posible que el Msvbvm60.dll o algún archivo parecido sea diferente, realmente no lo se  :rolleyes:

Entré al visor de eventos, y me encontré con los errores mencionados, estos son los códigos y algunos detalles de estos:

El programa VB6.EXE (versión 6.0.81.76) dejó de interactuar con Windows y se cerró. Para ver si hay más información disponible sobre el problema, comprueba el historial de problemas en el panel de control de seguridad y mantenimiento.
Id. de proceso: 17e4
Hora de Inicio: 01d6e13daa8a4c3b
Hora de finalización: 4294967295
Ruta de la aplicación: C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE
Id. de informe: 03cf55aa-0981-43c3-808f-e7c425acb432
Nombre completo del paquete con errores:
Id. de la aplicación relativa al paquete con errores:
Tipo de bloqueo: Top level window is idle


Este es el error mas reciente, y creo que el que me motivó a hacer esta pregunta acá.

Nombre de la aplicación con errores: VB6.EXE, versión: 6.0.81.76, marca de tiempo: 0x3592011f
Nombre del módulo con errores: ntdll.dll, versión: 10.0.18362.1171, marca de tiempo: 0xe94aeef6
Código de excepción: 0xc0000029
Desplazamiento de errores: 0x000a2907
Identificador del proceso con errores: 0x4090


Buscaré los errores a ver que encuentro.


Uno de los proyectos donde tuve este error, fue el siguiente:

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
    On Error Resume Next
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'We're going to call an API-function, without declaring it!
    Dim lb As Long, pa As Long
    'map 'user32' into the address space of the calling process.
    lb = LoadLibrary("user32")
    'retrieve the address of 'SetWindowTextA'
    pa = GetProcAddress(lb, "SetWindowTextA")
    'Call the SetWindowTextA-function
    CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
    'unmap the library's address
    FreeLibrary lb
End Sub


Me encontré este código en una página web, y quise probarlo, así que lo probé, y sucedió el error mencionado.

Otra cosa es que en ningún momento se muestra algún mensaje de error, simplemente la aplicación deja de responder y se pone en ese estado "X aplicacion (no responde)" y luego se cierra.

Gracias y saludos.

EdePC

https://www.vbforums.com/showthread.php?781115-RESOLVED-GetProcAddress-freezes-IDE
CitarCallWindowProc. That function is sending 4 parameters to SetWindowText. SetWindowText expect just 2 parameters. CallWindowProc can only be used with APIs that expect 4 parameters else crashes are inevitable

Pues como dice ahí, CallWindowProc envía 4 parámetros a SetWindowText, pero SetWindowText solo espera 2, entonces CRASH. CallWindowProc solo se utiliza para llamar a APIs que esperan 4 parámetros.

La alternativa que proponen es utilizar SendMessageA, este si usa 4 parámetros

Código (vb) [Seleccionar]
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Const WM_SETTEXT As Long = &HC

Private Sub Form_Load()
Dim lb As Long, pa As Long
  lb = LoadLibrary("user32")
    pa = GetProcAddress(lb, "SendMessageA")
    CallWindowProc pa, Me.hwnd, WM_SETTEXT, ByVal 0&, "hello"
  FreeLibrary lb
End Sub

keef

Hola!

Gracias por el link y el código, apenas pueda lo revisaré en detalle.

Ahora que me doy cuenta, y recuerdo el porqué de los errores, en la mayoría de los casos en los que se presentó este problema en el VB6, es porque hay un error en el código, mas específicamente, en el uso de las APIs.

Recuerdo que con GetUserName me pasó algo parecido por un problema en que no declaré una variable correctamente, y se cerró todo  :rolleyes:

Saludos

MCKSys Argentina

Hola!

El IDE de VB 6 no está diseñado para funcionar en Win10. Te recomiendo usar Win7 en una VM y desarrollar ahí la aplicación. Luego puedes copiar la app fuera de la VM y usarla/probarla.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."