Hola gente!
En 1 de mis proyectos(IHC), me gustaria tener 2 api's(.dll). 1 para el menu de arriba y otra para los forms que llama el menu.
La idea de esto, es dejar de distribucion libre el code de estas api's junto ocn el code del hardware pero no la del resto del programa(o mejor dicho del exe principal y sus configs.)
Me pueden dar algun tipo de info sobre como crear un api y respecto a cargarlas.
Saludos y ojala me ayuden.
Que es lo que no sabes crear una DLL o usar las Apis ???
El siguiente link es un buen tutorial de como crear una DLL con VB
http://www.elguruprogramador.com.ar/zonas/ver.asp?id=10
Ambas:P
El problema es que yo uqiero tener una aplicacion, que cargue 2 librerias basicas y esas a su vez cargan otras dll's con funciones.
La idea es que el programa base no requiera modificaciones y que pueda ser comodamente modificado a travez de dlls por el usuario.
Saludos
Quizas este otro link sea de tu interes (El archivo de configuracion)
http://www.geocities.com/grenvilletryon/teoria.html#El%20archivo%20de%20configuracion
Acabo de ver en primer enlace y te digo que primero me decia que la dll no podia cargarse. y despues la llame como api con:
Public Declare Function mimensaje Lib "MyMessage" (mensaje As String) As Long
pero me dice que no encunetra el punto de entrada. porque pasa esto?
Saludos
Cuando una declaracion Api no encuentra el punto de entrada es que no es la correcta u otra version del sistema operativo.
Para usar una Dll con nuestros programas VB, normalmente se va al menu Proyecto->Referencias; luego le das Examinar la seleccionas donde este y ya la linkiastes, finalmente Aceptar.
A modo de reseña:
Un colega que habia hecho una aplicacion de bases de datos completamente en Access necesitaba un mecanismo para exporta e importar los registros de una tabla; se me ocurrio crear una Dll para esto, cuya libreria le implementaba una interfaz de cuadros de dialogos para la importacion y exportacion ademas de una barra de progreso. Como la use? De la misma manera que VB en Access se agrega por las referencias ActiveX.
Como te digo que sin ti estaria perdido.
Saludos y gracias.
Por cierto, antes que me olvide y ya que es el objetivo del dll.
Como hago para crear en el dll un menu y poder mostrarlo en la aplicaion madre???.
Saludos
Todo se puede siempre que le pongamos mucho embullo y leamos requetebastante sobre un tema.
Me parece que mejor seria un OCX para lo quieres, ya que una DLL, a mi entender tendrias que programar mas.
Asi podrias crear tu propio control-editor de menus personalizable y que le puedas añadir iconos a sus items tambien.
Aqui te dejo un link para crear menus con la Api.
http://www.elguille.info/colabora/vb/menu_jordi.htm
http://downloads.elguille.info/BajarZip.aspx?sección=/colabora/vb/&zip=JORDIGB.ZIP
/bigkiss :p
Saludos y gracias
Bueno, debido a que el tuto es para vb 3 y 4 16 bits. Da errores con los meimbros de los picture box y da errores con las funciones.
No sabes como se puede hacer con vb 6?.
Saludos y gracias
Lo que sucede es que te faltan las respectivas declaraciones Api
Te descargaste el ejemplo completo del segundo link??
http://downloads.elguille.info/BajarZip.aspx?sección=/colabora/vb/&zip=JORDIGB.ZIP
En esta pagina te van a pedir que te registres, pero puedes darle al boton 'Entrar como usuario invitado' y luego 'Bajar el fichero'
Saludos.
Si lo hice, y da varioas errores.
Saludos
Utiliza la herramienta del Visor de API para copiar las funciones de 32 bits. Esta en el menu complementos o sino en el siguiente directorio:
..\Microsoft Visual Studio\Common\Tools\Winapi
Si te da errores mostra los errores que te da.
Saludos.
Dice que hwndList no es un miembro ni propiedad validos
Y que no coinciden lso usuarios de la funcion createmenu.
Saludos
hwndList debe ser un registro de un tipo definido por el usuario pero no existe en la estructura, y lo otro no lo conozco o lo conozco de otra manera seguramente.
Postea la parte del codigo en donde te da el error, no fuiste muy explicito.
Saludos.
Foto:
http://img285.imageshack.us/img285/5901/dibujo3kj.jpg
Saludos
El objeto MessageBlaster no existe mas en VB 6, es de versiones anteriores asi que ese codigo no sirve :(
Mira en AllApi.net (http://www.mentalis.org/index2.shtml), ahi hay codigos de ejemplo.
De todas formas si explicaras bien cual es tu objetivo seguramente existen otros metodos sin usar la API para hacerlo. Para crear otros menus no es necesario usar la API, podes crear uno solo, ponerle un indice y luego cargar nuevos con Load, pero explica bien que queres hacer.
Saludos.
El software, es un control para un hardware maestro que cotrola un monton de dispositivos. Todo con pics.
Entonces, yo no quiero dar el codigo del exe. Sino el de 2 apis basicas. 1 contiene le code para generar lso menu. Cuestion de que si alguien desea añadir ponele 1 placa mas al hardware, solo agrega la opcion al menu y su respectiva funcion en la otra api. Aparte de esta otra api, tambine hay una por placa del hardware. que son cargadas por la segunda api.
Saludos
Ahora si ya se entiende el objetivo, jeje. Bueno lo que tenes que hacer no es escribir las funciones para crear un menu, sino las funciones para que realicen las tareas como agregar dispositivo, configurarlo, etc. y ponerlas en una DLL. El programador que utilice esa DLL se encargara de utilizar como quiera esas funciones, con menus, botones, etc.
Por ejemplo, creas una DLL (en VB son DLL ActiveX) y un modulo de objeto llamado HardClass. En este modulo podrias poner las funciones AgregarDispositivo, EnumerarDispositivos, CambiarOpcion y todas las relacionadas con el hardware que vas a controlar.
Estas funciones son las que controlarian los dispositivos externos, pero cuando compilas la DLL el programador que la use la va a agregar como referencia al proyecto, entonces va a poder crear el objeto HardClass y usar sus funciones, pero el codigo no lo ve. Entonces eso depende del estilo propio del programador si pone un menu o un boton "Agregar Dispositivo".
Saludos.
Por eso, las dlls en total, son estas:
GlobalFunctions.dll - Tiene funciones globales del programa, como el acceso al registro, programas de actualizacion, downloaders, etc.
Boards.dll - Contiene la informacion de control de cada dispositivo que controla el hardware central. Ya que esto se hace mediante el puerto paralelo y el pic que resive informacion y segun ella, hace tal o cual cosa con cierto dispositivo. Como el hard es libre, tambine se distribuyen esquemas y demas para la ampliacion del mismo.
Driver.dll - Contiene funciones ocmo ResetHardware, SendVols(pin), StopVolt(Pin), SendData(Pind) GetData(pin) y muchas mas.
Menu.dll - Ovbiamente esta dll genera los menus que el programador desida en indique y hacen referencia a boards.dll o al propio de cada componente(aun no lo desido).
Y aparte, 1 dll por placa que estarian contenidas en el directorio Boards dentro del dir madre dle programa. Estas son llamadas desde Boards.dll
Saludos
Bueno Menu.dll no deberias implementarlo de esa forma. Lo que deberias hacer es crear un objeto en board.dll con propiedades y metodos para enumerar los dispositivos, y que este objeto (por ejemplo podria llamarse UserClass) contenga una coleccion con todos los dispositivos, sus propiedades y metodos.
La estructura seria algo asi:
BOARDS.DLL
* Clase UserClass *
- Este modulo de clase seria la interfaz entre el usuario y todos los dispositivos de hardware -
Property Get Devices(Indice) As DeviceClass
'Esta propiedad devolveria el objeto DeviceClass que contiene las propiedades y metodos para comunicarse con el dispositivo especificado en Indice. Indice puede ser un numero que identifica al dispositivo o podrias crear una funcion para buscarlo por el nombre -
End Property
Property Get DevCount() As Long
' Esta propiedad devuelve la cantidad de dispositivos de hardware -
End Property
Function EnumDeviceNames(outNames() As String) As Integer
' Esta funcion enumeraria los nombres de los dispositivos, podrias identificarlos con los nombres de las DLL o mejor, usar polimorfismo para implementar en las DLL de los dispositivos, y asi crear un objeto dinamicamente para comunicarte con ese dispositivo (mas adelante explico esto) -
End Function
Function FindDevice(Spec) As DeviceClass
' Podrias escribir una funcion que busque un dispositivo por el nombre o alguna otra propiedad -
End Function
Ahora el problema que se presenta es como comunicarse con los otros dispositivos ya que cada uno esta un una DLL diferente.
La solucion a esto es el polimorfismo, que es un concepto de la programacion orientada a objetos que permite la reutilizacion de codigo. Esto significa que yo puedo usar el mismo codigo para varias DLLs sin tener que copiarlo, lo que nos permite ampliarlo luego y uniformar un sistema.
La idea del polimorfismo para este proyecto es la siguiente:
1. Se crea una clase con todas las propiedades y metodos que tienen que tener todos los dispositivos, pero sin el codigo, solo las declaraciones (se dice que se crea la interfaz). Por ejemplo llamemosle IDevice. Entonces esta clase tendria por ejemplo las siguientes propiedades y metodos:
* Clase IDevice *
Property Get DeviceName() As String
End Property
Sub Reset()
End Sub
Sub SendVols(pin)
End Sub
Sub StopVol(pin)
End Sub
Sub SendData(pin)
End Sub
Sub GetData(pin)
End Sub
2. Creas una DLL con este modulo de clase (ninguna cosa mas a menos que se te ocurra) llamada devices.dll.
3. Cada DLL para un dispositivo tiene que incluir como referencia a devices.dll, y tener una clase predeterminada llamada DevMain que implemente al modulo IDevice (mas adelante explico como implementarlo).
Ahora supongamos que tenemos un motor paso a paso y tenemos que crear la DLL stepengine.dll para este dispositivo. Entonces creamos el proyecto DLL ActiveX y hariamos lo siguente:
1. Agregar como referencia al proyecto el archivo devices.dll
2. Crear el modulo de clase predeterminado DevMain
3. Implementar el modulo IDevice que esta en devices.dll. Para esto existe la palabra clave Implements. Se puede usar solo a nivel de modulo en modulos de clase. En la parte de declaraciones ponemos:
Implements IDevice
Vas a notar que en la lista de objetos donde solo te aparecia Class, ahora te aparece IDevice, entonces hay que implementar cada funcion y propiedad.
En el modulo de clase quedaria algo como esto:
Private Property Get IDevice_DeviceName() As String
End Property
Private Sub IDevice_GetData(pin As Variant)
End Sub
Private Sub IDevice_Reset()
End Sub
Private Sub IDevice_SendData(pin As Variant)
End Sub
Private Sub IDevice_SendVols(pin As Variant)
End Sub
Private Sub IDevice_StopVol(pin As Variant)
End Sub
Eso significa que implementaste el modulo IDevice en DevMain de engine.dll. Ahora solo queda escribir el codigo que queramos que se ejecute para cada metodo, y crear los metodos propios de la clase.
¿esto para que sirve?, bueno antes habia dicho "unificacion", y esto quiere decir que, por ejemplo, no importa el codigo que haya que escribir en el metodo Reset de un motor paso a paso o de una licuadora (por decir algo :P), siempre van a ser lo mismo para el programa. Es decir que la clase DevMain de cualquier dispositivo va a ser la misma, esto se llama polimorfismo ;D.
Bueno continuo con la idea. Una vez que escribis el codigo para cada metodo, y propiedad, creas las mismas propiedades y metodos para la clase, ya que cuando se implementa un modulo no forma parte de la interfaz de la clase donde se implementa.
Esta parte es sencilla porque solo llamamos a los metodos de la clase implementada:
Property Get DeviceName() As String
DeviceName = IDevice_DeviceName
End Property
Sub GetData(pin As Variant)
Call IDevice_GetData(pin)
End Sub
Sub Reset()
Call IDevice_Reset
End Sub
Sub SendData(pin As Variant)
Call IDevice_SendData(pin)
End Sub
Sub SendVol(pin As Variant)
Call IDevice_SendVol(pin)
End Sub
Sub StopVol(pin As Variant)
Call IDevice_StopVol(pin)
End Sub
Luego se le pueden agregar mas clases al dispositivo, pero esta clase tiene que ser la misma para que todos los dispositivos tengan algo en comun.
Una vez hecha la parte de dispositivos hay que enumerarlos y poder llamar a sus metodos, y esta es la parte mas sencilla.
Para enumerarlos simplemente se pueden enumerar los nombres de las DLLs, y para comprobar si son validos crear los objetos predeterminados usando la funcion GetObject.
Entonces primero se agrega como referencia a Boards.dll el archivo drivers.dll, luego en la funcion EnumDeviceNames enumeras los nombres de los archivos y los guardas en una matriz de Strings, creas una variable de tipo IDevice.
'Modulo UserClass de boards.dll
Property Get Devices(Indice) As DeviceClass
Dim csDevice As IDevice
Set csDevice = GetObject(sDriver(Indice), "DevMain")
Set Devices = csDevices
End Property
DeviceClass es una clase que se encuentra en boards.dll y tambien implementa IDevice, pero se le puede agregar mas propiedades y metodos.
Bueno espero que te haya servido.
Saludos.
Algunas cosas no las entendi, porque no me llevo bine con las dlls en vb y las clases.
Y ose hacer dlls pero en c++, pero como no me da el cuero para desarollar la aplicacin en c++ tengo que usar el vb.
Voy a tratar e hacerlo.
Saludos