• Lunes 18 de Noviembre de 2024, 07:34

Autor Tema:  Comprobar Si Existe Un Ocx  (Leído 3231 veces)

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Comprobar Si Existe Un Ocx
« en: Jueves 6 de Mayo de 2004, 12:10 »
0
Buenas genios!  :hola:  Tengo una pequeña duda:

Tengo un programa en el que uso dos OCX de comunicación específicos de los dos programas con los que se comunica.  Mi pregunta es: ¿Existe la posibilidad de ejecutar mi programa en un pc donde no se han instalado alguno de los otros programas(o los dos), comprobar que no existe el OCX en cuestión para ejecutar o no las funciones que utilizo?

Lo que pasa es que no puedo incluir el OCX como archivo de dependencia(creo que es algo así) pq si lo sobreescribe sobre el que existe, el otro programa no lo reconoce y no funciona.

Otra posibilidad sería crearme mi propio OCX que se comunicase con el OCX original, pero me gustaría sabes si existe la posibilidad de hacer lo que pregunto

Gracias  :D

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #1 en: Lunes 10 de Mayo de 2004, 17:52 »
0
Hola tiquinho.

Puedes hacer algo como lo que te cuento:

Cuando instales la aplicación, comprueba si existen previamente en el path donde vas a instalar los ocx que necesitas. Si están presentes, desregístralos y renombralos si los quieres conservar. Copia tu versión de ocx con la aplicación. Registra los ocx y listo.

Para registrar/desregistrar los componentes usa algo así:
Registrar
Código: Text
  1.  
  2. Shell "Regsvr32 /S C:\Ruta\Archivo.ocx"
  3.  
  4.  

Desregistrar
Código: Text
  1.  
  2. Shell "Regsvr32 /U /S C:\Ruta\Archivo.ocx"
  3.  
  4.  

El modificador /S sirve para registrar de forma silenciosa, es decir, sin que salga el típico mensaje de aviso.

Suerte.

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #2 en: Lunes 10 de Mayo de 2004, 18:44 »
0
hola Brroz:

Creo que no he hecho bien la pregunta, así que lo volveré a intentar:

El tema es que no necesito instalar el ocx, porque ya lo instala el programa con el que me comunico(el que debería estar instalado), y si no está instalado, no necesito para nada el ocx, por lo que en principio no tengo que instalarlo yo.  Aquí es donde yo me pregunto:¿pasará algo si instalo mi programa(sin el ocx) en un pc donde no estea presente el ocx?

A lo mejor la solución es declarar el objeto de ese ocx dinámicamente, comprobando primero que existe en el pc,no? ¿Sería posible?

Por cierto,cuando dices :"cuando instales la aplicación..." ¿a qué refieres exactamente? Yo hasta ahora había pensado usar el Asistente de Empaquetado que venía con el Visual 6.0, aunque después de ver algunas conversaciones del foro cambio al Visual Studio Installer,¿permite este hacer más cosas?(digo como crear archivos, o escribir en el registro sólo al instalar, sin tenerlo que hacer en el programa)

Gracias por contestar! :gracias:

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #3 en: Martes 11 de Mayo de 2004, 15:24 »
0
Hola tiquinho.

Si es posible que no exista un ocx que usas en un formulario determinado, y no deseas instalar tu ese ocx, debes supervisar el error que se producirá en el momento en que intentes abrir ese formulario (si no me equivoco un error 339). Algo así:

Supongamos que este es el formulario principal desde el que intentas abrir el formulario con el ocx en cuestión (llamémosle Form2, por ejemplo). Supongamos pues que Form2 se abre al pulsar un botón de Form1. Imaginemos también que para el caso de que no exista el ocx, en vez de un formulario Form2, abriremos un formulario Form3 con otra historia...
Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.  
  4.    On Error Goto Err_Command1_Click
  5.  
  6.    Dim frmX As Form, ind1 As Boolean
  7.  
  8.    Set frmX = New Form2
  9.    frmX.Show
  10.    Goto Exit_Command1_Click  
  11.  
  12. Open_Form3:
  13.    Set frmX = New Form3
  14.    FormX.Show
  15.  
  16. Exit_Command1_Click:
  17.    Set frmX = Nothing
  18.    Exit Sub
  19.  
  20. Err_Command1_Click:
  21.    If Err.Number = 339 And Not ind1 Then
  22.        ind1 = True
  23.        Resume Open_Form3
  24.    Else
  25.        MsgBox "(" & Err.Number & ") " & Err.Description, vbCritical, "Command1"
  26.        Resume Exit_Command1_Click
  27.    End If
  28.  
  29. End Sub
  30.  
  31.  

Cuando decía eso de "Cuando instales la aplicación..." se me estaba yendo un poco la olla y estaba en la situación de que tú instalabas la aplicación mediante un programilla de factura propia .Realmente es algo muy sencillo, no sé porque a veces hay tantas historias con los instaladores... obtener el archivo de dependencias con el empaquetador de vb e identificar los archivos que realmente hacen falta (y esto si es que ya no lo sabemos de antemano) y hacer un pequeño programa que cree directorios, copie archivos, registre componentes, etc.

Espero que el ejemplo de ahora sí  te sea de ayuda.

Suerte.

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #4 en: Martes 11 de Mayo de 2004, 17:55 »
0
Gracias por echarme un cable. Brroz, aunque creo que tendré que buscar otra forma de solucionarlo, porque ese ocx lo utilizo en el formulario principal de mi programa, por lo que supongo que será más complicado aplicar lo que me pusiste, o ¿sería posible hacer lo mismo, pero en vez de antes de lanzar un Form2, declarar mi objeto?  

Como ves, sigo empeñado en declarar el objeto en tiempo de ejecución, pero no sé como podría hacerlo, ahora mismo lo tengo insertado en el formulario en tiempo de diseño, ¿hay forma de hacerlo en tiempo de ejecución? ¿Sería algo así?:
Código: Text
  1.  
  2. Private Sub Form1_Load()
  3.  
  4.     On Error Goto Err_Ocx
  5.  
  6.     Static var as New MyOcx
  7.  
  8.     Exit Sub
  9. Err_Ocx:
  10.  
  11.     MsgBox "Ocx no instalado", vbCritical
  12.  
  13. End Sub
  14.  
  15.  

Esto era lo que tenía pensado hacer al principio, pero no me dejaba, por lo que inserté el objeto directamente y me propuse solucionarlo después.
¿Que tipo de objetos puedo usar con el New?, porque he probado y sólo me deja con los form y pocos más

Muchas gracias por todo :)

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #5 en: Martes 11 de Mayo de 2004, 18:29 »
0
Hola.

Entonces veo dos posibles soluciones, aunque ninguna de las dos acaba de gustarme mucho:

1- Crea dos formularios 'principales' uno con el ocx y otro sin él. Aplica el código de antes pero desde una sub 'Main' que debe ser el inicio de la aplicación. Esta solución es redundante pero efectiva 100%.

2- Puedes intentar añadir dinámicamente el control ocx, pero con unas consideraciones...
Fíjate en este código para un formulario: añade un CommandButton en tiempo de ejecución.
Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private WithEvents cmd1 As CommandButton
  5.  
  6. Private Sub Form_Load
  7.     Set cmd1 = Me.Controls.Add("VB.CommandButton", "cmd1")
  8.     cmd1.Visible = True
  9.     cmd1.Caption = "púlsame"
  10. End Sub
  11.  
  12. Private Sub Form_Unload(Cancel As Integer)
  13.     Set cmd1 = Nothing
  14. End Sub
  15.  
  16. Private Sub cmd1_Click()
  17.     MsgBox "Me pulsaste"
  18. End Sub
  19.  
  20.  
Podrías hacer lo mismo sustituyendo el tipo CommandButton por el de tu ocx, pero si el ocx no existe, el programa casca en la declaración de la variable cmd1, con lo que estás en la misma de antes: sólo puedes interceptar este error desde un método que llame al formulario.
Una posible solución a esto podría ser declarar la variable como 'Object' e interceptar el posible error en el evento Load del form. Esta solución sería ideal si no fuera porque no podrás interceptar los eventos del control (una variable 'Object' no se puede declarar 'WithEvents'), sin embargo, si sólo utilizas ciertos métodos del control y no te importan los eventos que puede generar el ocx, estás de suerte, este es la forma que mejor se adapta a tus necesidades... El código quedaría algo asi:
Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private miOcx As ClaseMiOcx
  5.  
  6. Private Sub Form_Load
  7.     On Error Goto Err_Form_Load
  8.     Set miOcx = Me.Controls.Add("Proyecto.ClaseMiOcx", "NombreDeControl")
  9.     miOcx.Visible = True
  10.     miOcx.PropiedadX = "algún valor..."
  11.  
  12. Err_Form_Load
  13.     If Err.Number = 999 Then 'Ahora mismo no sé el nº de error, pero se sabe enseguida provocándolo...
  14.         Msgbox "No cuentas con la funcionalidad de tal ocx..."              
  15.     Else
  16.         MsgBox "(" & Err.Number & ") " & Err.Description
  17.         Unload Me
  18.     End If
  19. End Sub
  20.  
  21. Private Sub Form_Unload(Cancel As Integer)
  22.     Set miOcx = Nothing
  23. End Sub
  24.  
  25.  
Luego claro está, en el código deberías habilitar o no ciertas opciones, controlar si la variable miOcx = Nothing y cosas por el estilo


A ver si esto te ayuda algo más. Suerte.

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #6 en: Martes 11 de Mayo de 2004, 20:24 »
0
Muchisimas gracias! :gracias:  :gracias:  :gracias:

Creo q tengo la suerte de que no me hacen falta los eventos, así que aplicaré lo segundo que me dices.  Muchisimas gracias otra vez, en serio, gracias a ti, primero sé más cosas, y segundo y más importante, no tengo que cambiar tanto mi programa, que ya tenía más modificaciones encima, casi necesito un mapa pa entenderlo yo, jeje

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #7 en: Miércoles 12 de Mayo de 2004, 12:47 »
0
Hola tiquinho.

Supongo que te habrás dado cuenta de los gazapos que tiene el código (cosa de hacer las cosas con prisas y al vuelo). Para que quede más claro y no dé lugar a confusión, aquí lo escribo de nuevo. Me alegra que la solución te sea útil.

Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private miOcx As Object
  5.  
  6. Private Sub Form_Load
  7.    On Error Goto Err_Form_Load
  8.    Set miOcx = Me.Controls.Add("Proyecto.ClaseMiOcx", "NombreDeControl")
  9.    miOcx.Visible = True
  10.    miOcx.PropiedadX = "algún valor..."
  11. '  .
  12. '  .
  13. '  .
  14.    Exit Sub
  15.  
  16. Err_Form_Load
  17.    If Err.Number = 999 Then 'Ahora mismo no sé el nº de error, pero se sabe enseguida provocándolo...
  18.        Msgbox "No cuentas con la funcionalidad de tal ocx..."              
  19.    Else
  20.        MsgBox "(" & Err.Number & ") " & Err.Description
  21.        Unload Me
  22.    End If
  23. End Sub
  24.  
  25. Private Sub Form_Unload(Cancel As Integer)
  26.    Set miOcx = Nothing
  27. End Sub
  28.  
  29.  

Chao.

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Comprobar Si Existe Un Ocx
« Respuesta #8 en: Jueves 13 de Mayo de 2004, 11:49 »
0
Tío eres un fenómeno, hasta te corriges a ti mismo   :)
La verdad es que no me había dado tiempo a probarlo    :whistling:  
pero en cuanto pueda lo acabo, que es lo único que me queda de esa parte.

Muchas gracias de nuevo!