Sobre controles ActiveX

jmasso
25 de Abril del 2005
Saludos,

La interrogante que tengo es la siguiente; actualmente estoy desarrollando una aplicación que emplea un módulo de control ActiveX, que vino incluido en una programa que instale en mi máquina; por lo visto dicho módulo, puede ser usado por cualquier persona, ya que no se encuentra bloqueado ni nada por el estilo. La situación es que dicho módulo, no tiene ningún tipo de ayuda asociada, y básicamente he aprendido a usarlo mediante el ensayo y el error.

En el programa que vino "adjunto" dicho módulo funciona perfectamente con todos sus eventos y métodos.

El módulo de control, lo he agregado a mi aplicación en la forma de un componente, es decir, le digo a mi aplicación que voy a usar ese componente y listo!, lo ingreso a mi formulario y puedo usar sus propiedades, métodos y eventos.

El punto es que hay algunos métodos y eventos que me causan conflictos, y en vista de que no he conseguido la ayuda de este módulo de control el cual tiene por nombre: Agilent TraceView ActiveX Control Module, no se como atacar el problema.

La situación es que cuando empleo ciertos métodos, me dice que Visual Basic ha detectado un problema y debe cerrarse; y en vista de que estoy empleando WinXp y VB6.0 (el incluido en Visual Studio 6.0), en esta ventana de error, me aparecen los botones de <Depurar>, <Enviar informes de errores> y <No enviar>. Cuando hago click en depurar, me aparece el programa de depuración de Visual C++, y la tabla de direcciones donde se genera el error, la cual es la siguiente:

0FC04509 je 0FC04527
0FC0450B je 0FC07AF3
0FC04511 mov eax,dword ptr [edi-4] <----- Aquí aparece el error ¿¿¿???
0FC04514 push eax
0FC04515 push edi
0FC04516 call dword ptr ds:[0FA910BCh]
0FC0451C test eax,eax


Ese error me lo generan 3 de los aproximadamente 25 métodos que tiene asociado el módulo de control, el resto de los métodos funcionan perfectamente.

Te pongo un ejemplo de uno de los métodos que me genera el error:

Info = Me.Traza.GetTotalFiberInfo(IndiceDeLaTraza, szTotalLength, szTotalLoss, szTotalAttenuation, szTotalReturnLoss, szTotalNumOfEvents)

Este método me devuelve un estado 'Verdadero', si la operación fue realizada correctamente, si un estado 'Falso' en caso contrario.

Emplea una serie de variables, las cuales fueron declaradas según el tipo de datos requeridos (string, no limitado a número de caracteres), y la variable "Info", fue declarada como Boolean.

Cuando agrego un punto de interrupción, justo después de la instrucción mostrada; obtengo que efectivamente, el valor de "Info", ha sido cambiado a 'Verdadero', la variable "IndiceDeLaTraza", tiene su valor correcto; pero.... cuando me posiciono sobre cualquiera de la otras variables, aparece la ventanita de error "Visual Basic ha detectado un problema y debe cerrarse...", eso ocurre con todas las variables de ese método, menos con la última variable del método "szTotalNumOfEvents", y esta lo que me dice al posicionar el cursor sobre ella es:

szTotalNumOfEvents=<Memoria insuficiente>

En caso de que el problema sea que la memoria sea insuficiente, ¿cómo hago para ampliarla?, se puede hacer eso?...

Cundo la operación de este método no se ha podio realizar, igualmente me aparece el error.

Eso es en lo que respecta a los métodos; ahora bien, hay un evento del objeto, que me tiene dando vueltas y que aun no he podido darle explicación alguna; y es el siguiente:

Private Sub Traza2_MarkerMove(ByVal sMarkerState As Integer, ByVal bIsMarkerA As Boolean, ByVal lPosition As Long, ByVal MarkerInfo As 0)

End Sub

Lo vieron? que es eso de "ByVal MarkerInfo as 0" (cero); que me representa ese cero??, realmente aquí quede frío...

Les comento que cuando empleo este evento, lo tengo que hacer inmediatamente después de haberlo declarado, es decir, compilo el programa, antes de que Visual Basic "se de cuenta", que hay un error de sintaxis, y bueno... como se imaginarán, cuando ocasiono dicho evento, aparece la ya muy conocida ventana: "Visual Basic ha detectado un error y debe cerrarse..."

La tabla de dirección del error y el código asociado a la misma, que aparecen cuando le doy depurar, es la siguiente:

0FB08C68 push dword ptr [esp+4]
0FB08C6C call 0FA947B3
0FB08C71 mov eax,dword ptr [eax+0Ch] <--------- Error :(
0FB08C74 ret 4
0FB08C77 push esi
0FB08C78 mov esi,ecx


Ahora bien, cuando voy al Examinador de Objetos y busco dicho evento, esto es lo que aparece en la descripción del mismo:

Event MarkerMove(sMarkerState As Integer, bIsMarkerA As Boolean, lPosition As Long, MarkerInfo As Unknown)
Miembro de TRACEVIEWLib.TraceView

"MakerInfo as Unknown"??? que es eso?? realmente no lo entiendo :(

Hay alguin tipo de procedimiento, que me impida salir de la aplicación?, es decir, que prevenga la detección del error por parte de Visual Basic y que no se salga del mismo?

Estoy dispuesto a escuchar cualquier tipo de ayuda, sugerencias y comentarios... realmente estoy desesperado...

Les digo que las características de la máquina con las que estoy desarrollando esto, son las siguientes:

AMD Sempron 2200+
RAM 512Mb, operativos 448Mb, bendita tarjeta de video consumidora de recursos ;)
WinXp Sp2
Visual Studio 6.0

Por adelantado, muchas gracias por su colaboración.

Sin más que decir, me despido atentamente de Uds.

José Manuel
Saludos desde Venezuela!

. : AlphaSoft : .
25 de Abril del 2005
O.k.

Hola!

Parece ser que el problema esta a la hora de mover la memoria, talves ya no tengas suficiente memoria y por eso es que el VB se cierra.

Si hacemos cuentas:

Windows Xp: 256+ RAM
VB6: 64 RAM
tu programa ?
Total: 320+ RAM

Aunque debemos tener en cuenta los otros programas y servicios que usas. Como ves, la falta de memoria puede ser la causa, aunque no descarto otras posivilidades.

Para el control de errores:

Al principio de cada procedimiento ( incluso antes de las definiciones de variables locales ) debes decirle a VB que cuando halla un error ejecute el codigo predispuesto para eso...

---------------------------------------------------------------------------

Private Sub Cualquiera( parametros as Cualquiera)

On error Goto Error

Definiciones

Codigo
Codigo
codigo

Exit Sub

Error:
msgbox "Error #" & err.number & vbnewline & vbnewline & err.description, vbCritical, "Error!"
Resume next

End Sub

---------------------------------------------------------------------------

Como ves, la primera instruccion en el procedimiento es " On Error Goto Error " que le dice a VB " Si hay error no hagas pendejadas y ve a la etiqueta ERROR "

Cuando hay un error, VB ya sabe que no tiene que hacer sus pendejadas ( en este caso cerrarse ) y que tiene que ejecutar el codigo que esta despues de la etiqueta ERROR, esto sirve basicamente para 2 cosas:

1.- Para que no se cierre la aplicacion
2.- Para que tengas oportunidad de ejecutar las acciones que programaste para ese caso ( el caso de un error ).

Quiero decirte que este ejemplo muestra un MsgBox con el ya famoso mensage de error de Windowz, dantote el numero de error y la descripcion, pero tu puedes crear tu propio codigo como mejor te parezca, crear un log, cerrar la aplicacion tratar de arreglar el error, en fin, usa tu imaginacion.

Ese Control de Errores lo tienes que poner el los puntos CRITICOS de tu app ( yo diria que en todos los procedimientos ), asi, lograras que tu app sea mas estable.

Espero que de algo te sirva... Saludos!

. : AlphaSoft : .