Problema con dll's

Iniciado por Thaorius, 27 Septiembre 2005, 03:30 AM

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

Thaorius

Bueno, les queria preguntar como puedo hacer para cargar una dll echa en vb mediante codigo.

Lo nesecito para esto:
Un programa de administracio nde bases de datos con modulos. Osea, que permite supongamos un modulo para una base de datos de inmobiliaria, otro para no se, una farmacia, etc. Todo esto con un comando en el accesos directo, supongamos -module farmacia,etc.
La cosa es que el programa carga de un archivo ini los datos del modulo, como el nombre de la dll de ste y la carga para posteriormente ejecutar sus funciones.

EL problema es que no se como hacer para cargar la dll desde vb. Si es una dll de c++ la cargo como una pai pero no se para las de vb.

Saludos y espero me ayudarme.
Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí

Slasher-K

Con la función GetObject podés crear dinánimacamente objetos desde un archivo.


        Dim oObject As Object

  Set oObject = GetObject("C:\MyLibreria.dll", "Class1")


También se pueden crear documentos de Word o Excel o cualquier archivo preparado para automatización.

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

Thaorius

Bueno, probe con este codigo:
Private Sub Form_Load()
Dim ErrorDll As Object
Set ErrorDll = GetObject("c:\error.dll", "ErrorReporter")
ErrorDll.CriticalError
End Sub


Pero me dice que ActiveX no puede crear el objeto.

La funcion de la dll que quiero usar es CriticalError.
Eh de supoenr que tengo que crear un objeto dentro de la dll para usarlo y que ErrorReporter debe ser una clase, como dice msdn pero sinceramente no tengo idea de como hacerlo.

Ahora busco en google, pero si sabes(seguro que si(xD)) por favor postealo.

Saludos
Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí

Slasher-K

Proyecto->Agregar módulo de clase

Al módulo de clase lo llamas ErrorReporter. Dentro del módulo sopongamos que escribis la función CriticalError. Entonces compilas la DLL y para llamar a la función usás el siguiente código:


Private Sub Form_Load()
        Dim oErrorDll As Object

  Set oErrorDll = GetObject("c:\error.dll", "ErrorReporter")

  Call oErrorDll.CriticalError
End Sub


Y así debe funcionar, el error que se produjo fue porque el módulo de clase no existía o su propiedad Instancing no estaba establecida a 5-MultiUse.

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

Thaorius

Las 2 cosas, estaba en GlobalMultiuse ::) :P

Sigue sin andar :( :( :(...

El codigo que tengo es este:
Private Sub Form_Load()
Dim oErrorDll As Object
Set oErrorDll = GetObject("c:\error.dll", "clsErrorReporter")
Call oErrorDll.CriticalError
End Sub


Y la dll esto:
Public Sub CriticalError()
MsgBox "DB Admin produjo un error crítico en el sistema y debe cerrarse.", vbCritical, "Error"
End Sub


Su instancing esta a 5-Multiuse y la dll esta en c:\ y la clase se llama clsErrorReporter.

Que puede ser?

Saludos
Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí

Slasher-K

Bueno veo que con GetObject no funciona  :-\, pero debería. Modifiqué el código usando CreateObject para que cree el objeto desde el registro.

Por si no está registrada primero usa el programa REGSVR32 que se utiliza para registrar componentes ActiveX y está en todas las máquinas con Windows 95 o superior.


Private Sub Form_Load()
        Dim oErrorDll As Object
 
  Call Shell("regsvr32.exe /s C:\error.dll")
 
  Set oErrorDll = CreateObject("Error.clsErrorReporter")
 
  Call oErrorDll.CriticalError
End Sub


La nomenclatura siempre es la misma para las clases en el registro:

CitarNombreDll.NombreObjeto

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

Thaorius

 :( :( :(... definitavamente no es mi dia de suerte.

No anda tampoco, y tira el mismo error :(.

¿que sera?

Saludos
Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí

Slasher-K

A mi me funciona bien. Pero a ver vamos por paso:

1. Creas proyecto DLL ActiveX con un módulo de clase llamado clsErrorReporter.

2. Al proyecto lo llamas Error. No el nombre del archivo sino del proyecto, porque ese es el nombre con el que lo registra.

3. Propiedad Instancing de la clase a Multiuse, creas el procedimiento.

4. Compilas y ejecutas el código desde el otro programa en el evento Load del formulario.

Verifica lo del nombre del proyecto, es muy probable que sea eso.

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

Thaorius

Era el nombre del proyecto. Que era ErrorReporter y no error.

Errores tontos.

Bueno, estoy contento porue ya anda. ;D ;D ;D

Ahora me agarro los tutos de leer ficheros ini del guille y a aseguir programando.

Saludos y gracias.
Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí