• Sábado 20 de Abril de 2024, 15:35

Autor Tema:  Err "ActiveX no crea objeto" y "No tipo definido x usuario"  (Leído 5320 veces)

DeathWatch

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« en: Viernes 26 de Febrero de 2010, 06:45 »
0
Que onda, como estan  :)

Yo aca con una de muchas consultas (y participaciones desde luego) aqui en el foro  :P

Miren, tengo creado un Exe ActiveX, llamado XEjecutor.

Tengo otro Exe normal que hace uso del ActiveX, pero estoy teniendo una serie de problemas:

Dentro de este exe normal, si escribo:

Código: Visual Basic
  1. Dim Ejec_1 As Object
  2.  
  3. Set Ejec_1 = CreateObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe")
  4.  
  5.  
me arroja Error '429' en tiempo de ejecucion :
El componente ActiveX no puede crear el objeto.
Pero igual si en lugar de XEjecutor.exe le cambio el nombre a lasdjflk.exe, me da el mismo error, asi que creo que no esta haciendo referencia al archivo.

Por otro lado si escribo:

Código: Visual Basic
  1. Sub Main()
  2. ' Aqui, se supone que registro el Exe ActiveX, y aparentemente si lo hace, supongo yo...
  3. Shell ("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe /RegServer")
  4. ' Aqui llamo al Sub Prueba
  5. Prueba
  6. End Sub
  7.  
  8.  
  9. Sub Prueba()
  10. ' Aqui instancio al proyecto XProyEjec, a la clase XClsEjec, que se encuentran dentro del ActiveX XEjecutor
  11. Dim Ejec_1 As New XProyEjec.XClsEjec
  12. Set Ejec_1 = New XProyEjec.XClsEjec
  13.  
  14. ' Llamo a un procedimiento llamado Proceso, dentro del ActiveX
  15. Ejec_1.Proceso 1
  16.  
  17. ' y despejo el objeto.
  18. Set Ejec_1 = Nothing
  19.  
  20. End Sub
  21.  
  22.  
Obtengo Error de compilacion:
No se ha definido el tipo definido por el usuario.

Donde esta mi falla?  :blink:  :brickwall:

Les comento que la idea NO es entrar en VB, a Proyecto - Referencias, porque este exe normal y el exe activex, siempre se van a ejecutar en una maquina diferente.

Ojala puedan ayudarme

Gracias de antemano  :good:
Un saludo

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #1 en: Sábado 27 de Febrero de 2010, 12:45 »
0
Aunque has dato algunos detalles, no son todos los necesarios para entender tu problema.

Por ejemplo, el objeto que tratas de cargar, está compilado o lo usas en el proyecto de prueba todavía en diseño ?.
Puedes exponer una imagen del cuadro de propiedades del exe activeX  (de la clase)?
Hay más objetos o sólo una clase... ?
Has registrado la librería ?.

Suponiendo que por ahí no te hayas encontrado problemas, pués, pasemos a lo siguiente....

Te pongo un pequeño ejemplo que te servirá de guía, luego que lo verifiques por tí mismo, introduce las equivalencias a tu proyecto...
1 Crea un nuevo proyecto de tipo EXE ACTIVEX...
2 Dale un nombre al proyecto, por ejemplo : ExeActiveX y un nombre a la clase, por ejmplo: EXejemplo
3 Asegúrate que la clase tiene la propiedad instancing establecida a 5 (multiuse)
4 Escribe este código para clase (copia y pega)
Código: Visual Basic
  1.  
  2. Private Sub Class_Initialize()
  3.     MsgBox "hola"
  4. End Sub
  5.  
  6. Public Sub Saludar(ByVal cadena As String)
  7.     MsgBox cadena
  8. End Sub
  9.  
  10.  
5 En proyecto propiedades del proyecto modelo de subprocesos -> activa la casilla que que mejor te convenga, para el ejemplo nos vale bien ''conjunto de: 1 subprocesos'' (puedes aumentar la cifra si lo requiere tu aplicación, pero en esta de ejemplo con 1 nos vale)
6 Ahora compila el proyecto y cuando termine, ciérralo. Ahora abrimos nuevamente el entorno de vb6 para crear una aplicaciónde tipo exe estándar...
7 en el mismo código de carga del formulario (puesto que es un simple ejemplo vale, si lo prefieres ponlo para un botón), pega este código:
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3. '    Dim Ejec_1 As ExeActiveX.EXejemplo  ' sólo si se añade una referencia
  4.   Dim Ejec_1 As Object   'ExeActiveX.EXejemplo
  5.  
  6.     'Set Ejec_1 = New ExeActiveX.EXejemplo    ' sólo si se añade una referencia al proyecto.
  7.    Set Ejec_1 = CreateObject("ExeActiveX2.EXejemplo")
  8.     Set Ejec_1 = GetObject("", "ExeActiveX2.EXejemplo")
  9.    
  10.     Ejec_1.Saludar ("funciona correctamente")
  11. End Sub
  12.  
  13.  
Debería funcionarte sin problemas... cuando creas la instancia se crea la clase, por lo qwue se invoca el método initialize del activex y se ejecutará el código que pusimos, nos responderá 'Hola'
Cuando se ejecute el método Saludar, tomará la cadena que le hemos pasado y deberá mostrarnos el mensaje pertienente...

Fíjate que podemos usar tanto GetObject  como CreateObject... (cada una utiliza sus propios parámetros)
fíjate que no señalo ninguna ruta... ¿ por qué ? te preguntaras... porque cuando he compilado el proyecto automáticamente se ha registrado la librería. Por tanto lo que tienes que hacer es registrar adecuadamente la librería.
«Ma non troppo»
----> ModoVacaciones = False<----

DeathWatch

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #2 en: Domingo 28 de Febrero de 2010, 03:31 »
0
Amigo(a), mil mil gracias. No sabes cuanto te lo agradezco!!!  :D   :D   :good:   :beer:

Te juro que lo siguiente que te escribo no es para hacerte la “barba”, como decimos aquí en Mexico. Con tus ejemplos he entendido mejor esto de las clases, y la clave para que se solucionara mi problema, fue el ultimo comentario que hiciste:
Citar
fíjate que no señalo ninguna ruta... ¿ por qué ? te preguntaras... porque cuando he compilado el proyecto automáticamente se ha registrado la librería.

Y la solucion fue:
Código: Visual Basic
  1. Dim Ejec_1 As Object
  2. Set Ejec_1 = CreateObject("XProyEjec.XClsEjec")
  3. Ejec_1.Ejecutor 1
  4. Set Ejec_1 = Nothing
  5.  

O sea, usando tu ejemplo, yo lo que estaba haciendo era:
Set Ejec_1 = CreateObject("C:Documents and SettingsDeathWatchMis documentos ExeActiveX.exe")
en lugar de escribir:
Set Ejec_1 = CreateObject("ExeActiveX2.EXejemplo")
siendo que ya la habia registrado en:
Shell ("C:Documents and SettingsDeathWatchMis documentosExeActiveX.exe /RegServer")

Mira, te escribo todo el rollo que estaba haciendo, hasta que me trabé…

Buscando un tipo multi-threading en VB, me encontre con la siguiente pagina:
todoexpertos.com/categorias/tecnologia-e-internet/programacion/visual-basic/respuestas/168589/se-pueden-ejecutar-consultas-en-paralelo
donde se explica como realizar varias consultas al mismo tiempo.
Ese ejemplo me sirvio para darme una idea de cómo ejecutar varias aplicaciones al mismo.

Entonces realice lo siguiente:
1.- Abri un Proycto Exe ActiveX, con nombre XProyEjec.
En donde mencionas lo de “En proyecto propiedades del proyecto modelo de subprocesos -> activa la casilla que que mejor te convenga”, marco la casilla Subprocesos por objeto.
2.- Cree una clase llamada XClsEjec, con el siguiente codigo:
Código: Visual Basic
  1. Public Sub Ejecutor(ValNum As Integer)
  2. Dim frmEjec As XProyEjec.XFrmEjec
  3. Set frmEjec = New XProyEjec.XFrmEjec
  4.  
  5. Load frmEjec
  6.  
  7. frmEjec.MultiProcs ValNum
  8.  
  9. Set frmEjec = Nothing
  10.  
  11. End Sub
  12.  

3.- Luego agregue un nuevo proyecto Exe Standard, y genero un formulario, el cual tiene el siguiente codigo:
Código: Visual Basic
  1. Private VN As Integer
  2.  
  3. Public Sub MultiProcs(ValN As Integer)
  4. VN = ValN
  5. End Sub
  6.  

4.- Y al form, le agregue un Timer, con el siguiente codigo:
Código: Visual Basic
  1. Private Sub Timer1_Timer()
  2. MsgBox VN
  3.  
  4. Unload Me
  5. End Sub
  6.  

5.- Y genero el archivo XEjecutor.exe


6.- Luego, abro un proyecto Exe Standard independiente. Quito el formulario y agrego un modulo, con el siguiente codigo:
Código: Visual Basic
  1. Sub Main()
  2. Shell ("C:Documents and SettingsKyllMis documentosActiveXThreadsXEjecutor.exe /RegServer")
  3.  
  4. Prueba
  5. End Sub
  6.  

Y un sub donde tenia el problema.
Aun cuando habia registrado el ActiveX, si escribía

Código: Visual Basic
  1. Sub Prueba()
  2. Dim Ejec_1 As New XProyEjec.XClsEjec
  3. Dim Ejec_2 As New XProyEjec.XClsEjec
  4.  
  5. Set Ejec_1 = New XProyEjec.XClsEjec
  6. Set Ejec_2 = New XProyEjec.XClsEjec
  7.  
  8. Ejec_1.Ejecutor 1
  9. Ejec_2.Ejecutor 2
  10.  
  11. Set Ejec_1 = Nothing
  12. Set Ejec_2 = Nothing
  13.  
  14. End Sub
  15.  

Recibia Error de compilacion: No se ha definido el tipo definido por el usuario.
Y lo sigo recibiendo. Supongo que si no se hace referencia entrando a Proyecto – Referencias, y agregando el ActiveX, no se puede hacer referencia de la manera que expuse anteriormente.

Y si probaba con:

Código: Visual Basic
  1. Sub Prueba()
  2. Dim Ejec_1 As Object
  3. Dim Ejec_2 As Object
  4.  
  5. Set Ejec_1 = CreateObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe")
  6. Set Ejec_2 = CreateObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe")
  7.  
  8. Ejec_1.Ejecutor 1
  9. Ejec_2.Ejecutor 2
  10.  
  11. Set Ejec_1 = Nothing
  12. Set Ejec_2 = Nothing
  13.  
  14. End Sub
  15.  

pues recibia el mensaje Error '429' en tiempo de ejecucion : El componente ActiveX no puede crear el objeto.


Asi que como bien dijiste, la solucion fue cambiar el Set para que quedara:
Set Ejec_1 = CreateObject("XProyEjec.XClsEjec")


Ese era todo el rollo.
Si no deje algo en claro, comentamelo, para tratar de exponerlo un poco mejor.

Pues nuevamente, te agradezco mucho tu tiempo y tu ayuda.  :beer:  :good:  :good:

Un saludo  :hola:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #3 en: Domingo 28 de Febrero de 2010, 06:09 »
0
Cita de: "DeathWatch"
]Recibia Error de compilacion: No se ha definido el tipo definido por el usuario.
Y lo sigo recibiendo. Supongo que si no se hace referencia entrando a Proyecto – Referencias, y agregando el ActiveX, no se puede hacer referencia de la manera que expuse anteriormente.
Exactamente. Si no hay una referencia añadida no se puede usar NEW, porque no consta en la tabla (ROT) dicho objeto. Precisamente para eso sirven las referencias, para localizarlo en la tabla, por eso usar referencias es más rápido... Cuando se usa NEW, por debajo le está diciendo que debe buscarlo en la ROT y crear una instancia desde allí. Usando CreateObject le está diciendo que busque en el registro. y GetObject le está diciendo que si ya hay una instancia cargada con createobject, la obtenga de ahí (ahorra tiempo en verificaciones) y si no que la localice en el registro...

Cita de: "DeathWatch"
Si no deje algo en claro, comentamelo, para tratar de exponerlo un poco mejor.
Pues nuevamente, te agradezco mucho tu tiempo y tu ayuda.  :beer:  :good:  :good:
:rolleyes:  Eres tú quien pregunta y tienes dudas... yo lo tengo muy claro.

Tienes un pequeño error de concepto, que trataré de corregir..
Cuando usas la función CreateObject, la dirección que admite en todo caso se utiliza para el 2ª parámetro no para el 1º, además ahí la ruta se refiere a una ruta del servidor... de red donde se desea crear el objeto.

Luego, si por ejemplo tu aplicación opera con un tipo de archivo cuya extensión fuera pongamos ".banco" , podrías utilizar la función getobject para crear el objeto cargando ya el archivo indicado...
Código: Visual Basic
  1. dim miObjeto as object
  2. Set miObjeto= GetObject("C:archivo.banco", "MiproyectoActivexexe.Suclase")
  3.  
Y por tanto como podrás ver, nada tiene que ver esta ruta con la ruta donde se localiza el exe activeX
«Ma non troppo»
----> ModoVacaciones = False<----

DeathWatch

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #4 en: Domingo 28 de Febrero de 2010, 08:44 »
0
Hola de nuevo, ya ando por aqui otra vez  :P

Nada mas para comentar y consultar algunas cosas:

En
Citar
Nebire escribio:
Eres tú quien pregunta y tienes dudas... yo lo tengo muy claro.
:huh:
Yo se que tu lo tienes claro, puesto que me explicaste y me ayudaste a resolver mi problema.
Me referia a si no habia enredado mucho comentando lo que estaba haciendo, de forma que solo yo me estuviera entendiendo, y si habia explicado esta vez la raiz del problema que tenia.

Pero bueno, es igual  ^_^ , nada mas lo comenté, porque desde luego no me referia a que no supieras lo que me estabas explicando, o que no entendieras lo que estaba yo haciendo, sino que si lo que habia escrito, era entendible...  :P

Cambiando de tema...

Creo que si tengo un error de concepto  :P
Que bueno que me lo dices.
Y creo que ese error lo tenemos muchos, por lo que he visto en muchos foros  :o
Ya estuve echandole un ojo a ROT y a GetObject.
A ver si entendi bien lo que me comentabas... pongo un ejemplo
Hice un VBScript con el codigo:
dim fso, carp

Código: Visual Basic
  1. set fso=GetObject("", "Scripting.FileSystemObject")
  2. set carp=fso.GetFolder("C:Documents and SettingsDeathWatchMis documentosScripts")
  3. x=carp.Name
  4. msgbox x
  5. set fso=Nothing
  6. set carp=Nothing
  7.  

Me mostró el nombre de la carpeta.
Esto es porque en ROT ya existe la clase Scripting.FileSystemObject? Es a lo que te referías?
En mi ejemplo, al  registrar el Exe ActiveX con /RegServer, debo usar GetObject en lugar de CreateObject?
Si no lo registro, usando Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe", "XProyEjec.XClsEjec"), funcionaría? (Esto lo voy a probar personalmente, pero si no funciona, si me pudieras comentar la razon, porfas)

Una ultima pregunta  :P
Usando el ejemplo que puse, si en lugar de un Exe ActiveX fuera un Dll ActiveX, tal cual con los objetos form y timer y demas, he indicando en las propiedades del proyecto, Subprocesos independientes, si escribo
Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.dll", "XProyEjec.XClsEjec")
podria funcionar? respetando el multi-threading?

Realmente aunque el programa final se va a ejecutar en un equipo diferente, el programa principal y el ActiveX, ya sea Exe o Dll, van a estar siempre en una usb, en la misma ruta. Por eso lo pregunto.
(Por cierto, es para facilitar un proceso en el trabajo... no es una herramienta de hacking, ni nada por el estilo :P )

Te agradezco nuevamente tu tiempo y tus comentarios.
Me han servido de mucho

Buen fin de semana  :good:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #5 en: Domingo 28 de Febrero de 2010, 17:21 »
0
Cita de: "DeathWatch"
Hola de nuevo, ya ando por aqui otra vez  :P
Citar
Nebire escribio:
Eres tú quien pregunta y tienes dudas... yo lo tengo muy claro.
:huh:
Yo se que tu lo tienes claro, puesto que me explicaste y me ayudaste a resolver mi problema.
Me referia a si no habia enredado mucho comentando lo que estaba haciendo, de forma que solo yo me estuviera entendiendo, y si habia explicado esta vez la raiz del problema que tenia.
Esto te lo decía en broma... entendí que al intentar explicarte, te pareció no desenvolverte bien y enbarullarlo más...

Cita de: "DeathWatch"

Código: Visual Basic
  1.  
  2. dim fso, carp
  3. set fso=GetObject("", "Scripting.FileSystemObject")
  4. set carp=fso.GetFolder("C:Documents and SettingsDeathWatchMis documentosScripts")
  5. x=carp.Name
  6. msgbox x
  7. set fso=Nothing
  8. set carp=Nothing
  9.  
Es correcto, pero siempre que puedas usa referencias,  piensa que además de lo referente a la tabla, si en tiempo de diseño se declara el tipo de objeto, cuando se compila no necesita comprobar los tipos, por lo que resulta más rápido

Cita de: "DeathWatch"
En mi ejemplo, al  registrar el Exe ActiveX con /RegServer, debo usar GetObject en lugar de CreateObject?
Son similares, pero se usa Create object para obtener la 1º referencia y luego getObject para las siguientes...

Cita de: "DeathWatch"
Si no lo registro, usando Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe", "XProyEjec.XClsEjec"), funcionaría?
Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.dll", "XProyEjec.XClsEjec")
Esto está equivocado... no me leiste bien al final del post anterior

autocitándome:
Cita de: "Nebire"
Luego, si por ejemplo tu aplicación opera con un tipo de archivo cuya extensión fuera pongamos ".banco" , podrías utilizar la función getobject para crear el objeto cargando ya el archivo indicado...
Código: Visual Basic
  1. dim miObjeto as object
  2. Set miObjeto= GetObject("C:archivo.banco", "MiproyectoActivexexe.Suclase")
  3.  
Y por tanto como podrás ver, nada tiene que ver esta ruta con la ruta donde se localiza el exe activeX

Cita de: "DeathWatch"
(Esto lo voy a probar personalmente, pero si no funciona, si me pudieras comentar la razon, porfas)
No te molestes, ya te he indicado que eso no es correcto... y te he indicado la razón.

Cita de: "DeathWatch"
Una ultima pregunta  :P
Usando el ejemplo que puse, si en lugar de un Exe ActiveX fuera un Dll ActiveX, tal cual con los objetos form y timer y demas, he indicando en las propiedades del proyecto, Subprocesos independientes, si escribo
podria funcionar? respetando el multi-threading?
Échale un vistazo al 'patrón Singleton', bucea por 'gúgel'...
«Ma non troppo»
----> ModoVacaciones = False<----

DeathWatch

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #6 en: Lunes 1 de Marzo de 2010, 02:03 »
0
Hola que hay  :D

Ps antes que nada, gracias otra vez Nebire por tu tiempo y tus respuestas.
Me has aclarado varias cosas nuevamente, las cuales me serviran de mucho.

Dejame decirte tambien que esto de las clases es practicamente nuevo para mi  :(
Estuve buscando lo que me sugeriste del patron Singleton (instancia unica) y lo que alcance a entender es que se usa para evitar mas de una instancia a un objeto, pero que se pueden hacer varias referencias a ese objeto, usando esa unica instancia, lo que me hace pensar que usando un dll igual se podria crear una clase, y hacer varias referencias a un objeto por medio de tal clase, y que funcione como el ejemplo de multi-threading que escribi, pero no me queda nada claro... por que si? por que no?...  :angry:  :hitcomp:
Simplemente sobrepasa mi nivel de conocimiento  :argh:

Pero bueno...

Por otro lado, seguire buscando el metodo GetObject, pues no me queda claro para que sirve entonces el primer parametro...
Citar
DeathWatch escribió:
Si no lo registro, usando Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe", "XProyEjec.XClsEjec"), funcionaría?
Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.dll", "XProyEjec.XClsEjec")

Citar
Nebire escribió:
Luego, si por ejemplo tu aplicación opera con un tipo de archivo cuya extensión fuera pongamos ".banco" , podrías utilizar la función getobject para crear el objeto cargando ya el archivo indicado...
Código: Visual Basic
  1. dim miObjeto as object
  2. Set miObjeto= GetObject("C:archivo.banco", "MiproyectoActivexexe.Suclase")
  3.  

Y por tanto como podrás ver, nada tiene que ver esta ruta con la ruta donde se localiza el exe activeX
"MiproyectoActivexexe.Suclase" hace referencia al proyecto y clase del ActiveX, pero "C:archivo.banco", donde se carga, que carga (las clases del archivo .banco?), para que sirve el 1er parametro si el 2do no hace referencia a él, si es para que al ya estar cargado, posteriormente se pueda instanciar por ejemplo ("MiPoryectoArchivoBanco.Subclase"), etc?

 :brickwall:  :brickwall:

En fin... seguire investigando...

Te agradezco mucho tus aportaciones. Me han servido de mucho.
Ya le agregaré tales mejoras a mis progamas.

Un saludo  :)

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #7 en: Lunes 1 de Marzo de 2010, 08:08 »
0
Cita de: "DeathWatch"
Hola que hay  :D
 pero "C:archivo.banco", donde se carga, que carga (las clases del archivo .banco?), para que sirve el 1er parametro si el 2do no hace referencia a él
Un saludo  :)
Creo que me he explicado bien, sin embargo es normal que a pesar de ello a veces alguien no acabe de entender una cosa que nos parece (al que lo explica) bastante clara..

...así que intentaré explicártelo mejor con otro ejemplo.

Supongamos que tu eres el creador de  winrar, el programa para comprimir archivos. bien, como parte de tu programa tu has creado unas librerías pero también un tipo de fichero que se asocia con el programa, los archivos *.rar .... entonces se puede usar getobject, para que al mismo tiempo que crear el objeto ya reciba como parámetro de entrada un archivo de tipo rar.
Para qué quieres cargar un archivo rar ?.... pués porque eso es lo que se supone que hace tu programa trabajar con artivos de ese tipo... por tanto usas getobject y si lo necesitas le pasas la ruta de un archivo rar (por ejmplo: c:mis secretos.rar), entonces cuando se cargue el objeto ya abre el archivo de acuerdo a como opera el programa. Naturalmente no esás obligado a usar dicho parámetro, por ejemplo si vas a comprimir, no te hará falta, perosi vas a descomprimir un archivo (y esa es la razón por la que necesitas crear el objeto), pués selo pasas directamente...

Un modo de entenderlo mejor es llevándolo a la práctica... y un excelento ejemplo para llevarlo a la práctica esutilizar excel (por ejemplo),

Código: Visual Basic
  1.  
  2. dim xcel as object
  3.  
  4. set xcel = getobject("c:mis gastos.xls","Excel.Application")
  5.  
Debes notar YA sin dificultad que 'C:mis gastos.xls es un archivo que excel reconoce, que excel crea y que excel entiende. si yo le  digo "Excel.Application", ya sabe que objeto es (si está en la ROT o por lo menos regisrado en el equipo), por tanto carece de sentido indicar la ruta de donde se encuantra excel.exe, a nosotros no nos importa. La ruta del exe, sólo debe usarse para registrar la librería y ni getobject, ni createobject registran ninguna librería, tan sólo proporcionan una instancia a un objeto ya registrado, al igual que NEW, la diferencia con New, es que createobject y getobject se aplican a objetos no referenciados al crear la aplicación.

La programación en realidad no tiene nada de misterioso, son cosas muy sensatas y muy meditadas, a menudo cuando alguien pretende enseñarte algo, en realidad no te enseña nada que no supieras ya (de algún modo), sino que lo que hace es decirte con otro nombres y jerga 'extraña' algo que ya sabías tú por tí mismo. si en la vida piensas de forma coherente, verás que la programación es fácil y la parte difícil es aquella en la que tienes que entender que tal nombre largo y extraño es tal cosa.

Imgina el S.O. como tu casa, imagina los objetos como 'comida'... cuando usamos new, es como ir a la nevera (frigorífico), si hay cerveza, pués coges una pero y si no hay ???  (esto es una referencia en el proyecto, asegurarse de poner en la nevera las cervezas para cuando por la tarde empiece el partido y lo vayas a ver con los amigotes, estén a mno y fresquitas), pero si olvidaste reponerlo, puedes ir a la despensa, ese pequeño almacén donde guardas las compras dirias o semanales, claro que las cervezas estar´ñan calientes y seguramente estará más alejado de la tv. que la nevera, pero es lo que hay... bien este almacén, alacena, despensa o como lo quieras llamar, es el registro de 'güindous', para acceder aquí ya no se usa new, ahora debe usarse createobject  o getobject ... finalmente si ni en tu alamacén hay cervezas, lo que queda es mandar a alguien a comprarlas a la tienda más cercana... esto es instalar la librería, para que así esté diponible en tu almacén, y si lo quieres fresquito pués lo metes en la nevera (una referencia en tu proyecto)... Ahora entiende que tomar una cerveza de la nevera, o del almacén implica que debe existir , que ya lo has comprado y comprarlo (el paquete de cervezas) es lo que llamamos registrar la librería.... son 2 cosas ditintas.... new=trae la cervezade la nevera, Createobject= trae la cerveza del almacén (es más lento, debe comprobar si existe, y como es bastante más grandote que la nevera tardará mucho más) y  regsvr32= ve a comprar un paquete de cervezas (que son depositadas  en el almacén, disponibles si es whisky a lo mejor está reservado y no cualquiere puede echarse un vasito,  :beer: ).

No puedo explicarlo más claro, si te quedan dudas quizás debas mirar en otro sitio y ver si te lo explican de un modo que puedas entenderlo, aunque como te digo, a mi me parece que hablo muy sencillo y claro, de hecho casi nunca uso jerga, precisamente porque sólo sirve para entorpecer al que no sabe.

p.d.: Me olvidaba de una cosa importante respecto a GetObject...
Al usar el primer parámetro, ya no es obligatorio el segundo (en según qué objetos), usando el ejemplo que puse como código...:
set xcel = getobject("c:mis gastos.xls","Excel.Application"), puesto que he proporcionado una ruta, el ya localiza que librería le pertenece, por tanto asigna una referencia al objeto que lo manipula, por tanto esta otra línea es igualmente correcta (fíjate que utilizo otro objeto de excel distinto del anterior):
Código: Visual Basic
  1.  
  2. dim xBook  as excel.workbook
  3. set xBook  = getobject("c:mis gastos.xls")
  4.  
  5.  
Puede (eso si), ocurrir algún problema si otra librería que no es la esperada se ha asignado(la ha desbancado al pulsar doble click sobre un xls, se abre otra aplicación y no excel) , la extensión xls para si y sucede que los métodos (con sus parámetros) y propiedades  para manejar ese 'otro' objeto, no son los que utiliza excel.exe que son los que tu usas en tu código...

Con éste último ejemplo, espero que ahora si, podrás entender porqué este parámetro (que te parece extraño), es útil... porque resulta válido para localizar,  crear y devlver una instancia válida al objeto que lo maneja, que en este caso es excel... Y por último debes saber que esto último sólo funciona si el objeto es lo que se conoce como un 'documento compuesto', es decir tiene referencias a varios objetos (fíjate como el objeto lo he designado para que lo veas claramente: as excel.workbook, no como excel.application).
«Ma non troppo»
----> ModoVacaciones = False<----

DeathWatch

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Re: Err "ActiveX no crea objeto" y "No tipo definido x usuario"
« Respuesta #8 en: Miércoles 3 de Marzo de 2010, 05:16 »
0
Perfecto!!! Mas que entendido  :good:  :good:  :good:

Muchas gracias Nebire, por tus aclaraciones.
Igual, gracias por tu tiempo.

Por aqui andaremos, consultando, y aportando (dentro de lo que se sepa y se pueda  :P)

Un saludo
Excelente semana :beer: