Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: ‡‡‡ Đξλ†Ћ Щλ†ζЋ ‡‡‡ en 8 Febrero 2010, 09:03 am



Título: Exe ActiveX: Componente ActiveX no puede crear... No se ha definido el tipo...
Publicado por: ‡‡‡ Đξλ†Ћ Щλ†ζЋ ‡‡‡ en 8 Febrero 2010, 09:03 am
Que onda, como estan  :)

Yo aca con una consulta  :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
  1. Dim Ejec_1 As Object
  2.  
  3. Set Ejec_1 = CreateObject("C:\Documents and Settings\DeathWatch\Mis documentos\XEjecutor.exe")

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 este haciendo referencia al archivo.

Por otro lado si escribo:

Código
  1. Sub Main()
  2. ' Aqui, se supone que registro el Exe ActiveX, y aparentemente si lo hace, supongo yo...
  3. Shell ("C:\Documents and Settings\DeathWatch\Mis documentos\XEjecutor.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

Pero obtengo Error de compilacion:
No se ha definido el tipo definido por el usuario.

Donde esta mi falla?

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.

Me pueden ayudar por favor?

Gracias de antemano  ;)
Un saludo...


Título: Re: Exe ActiveX: Componente ActiveX no puede crear... No se ha definido el tipo.
Publicado por: ‡‡‡ Đξλ†Ћ Щλ†ζЋ ‡‡‡ en 28 Febrero 2010, 03:42 am
Solucionado!!!

Para referencia:
http://foros.solocodigo.com/viewtopic.php?f=143&t=42345 (http://foros.solocodigo.com/viewtopic.php?f=143&t=42345)



Título: Re: Exe ActiveX: Componente ActiveX no puede crear... No se ha definido el tipo...
Publicado por: cobein en 28 Febrero 2010, 05:27 am
Ups recien lo veo a este, pase por el otro foro y vi la solucion que plantearon. Ahora me gustaria comentar algunas cosas, que si no te pasaron te van a pasar. Primero que nada para registrar un COM vas a necesitar privilegios (no se si este es un problema para vos) que utilizando otros metodos, no son necesarios.

Bueno la primer cosa para comentar es que, si bien podes usar la shell, me parece mucho mas limpio invocar 'DllRegisterServer'.

Ejemplo:
Código:
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 Function RegisterLib(ByVal sPath As String) As Boolean
    Dim lLib    As Long
    Dim lProc   As Long

    lLib = LoadLibrary(sPath)
    If Not lLib = 0 Then
        lProc = GetProcAddress(lLib, "DllRegisterServer")
        If Not lProc = 0 Then
            Call CallWindowProc(lProc, 0&, 0&, ByVal 0&, ByVal 0&)
            RegisterLib = True
        End If
        Call FreeLibrary(lLib)
    End If
End Function


Ahora, el problema con este metodo y el de la shell es que ambos utilizan el registro y como comentaba anteriormente puede ser un problema en muchas situaciones.

Hay varias soluciones posibles pero obviamente va a depender de lo que estes haciendo, la primera y mas comun seria simplemente utilizar algun packager (eg: Molebox) , la otra mas standard es (siempre y cuando corras tu programa en XP SP2 o mayor) utilizar un manifest junto con alguna herramienta para automatizar el proceso de creacion como ser Make My Manifest. Por ultimo la que mas me gusta para cosas simples es una clase hecha por Arne Elster que permite crear objetos en base a su ruta, algo asi como lo que querias hacer inicialmente.

Links:

Registration-Free Activation of COM Components
http://msdn.microsoft.com/en-us/library/ms973913.aspx

Make My Manifest
http://mmm4vb6.atom5.com/

CreateObjectFromFile
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=67459&lngWid=-10