Crear dll con acceso a base de datos
Hola a todos:
tengo que crear una dll que acceda mediante odbc a una base de datos. He creado la dll y dentro de ella un tdatamodule en el que pongo la base de datos y la tquery para realizar una consulta. El problema esta cuando intento llamar al tmodule para abrir la base de datos o para hacer cualquier cosa porque me da un error de memoria. Me gustaria saber si me podeis ayudar a crear esa conexion a la base de datos dentro de mi dll. Muchas gracias por adelantado y un saludo. |
Lo que pasa es que cuando ejecutas tu DLL, el DataModule no se crea automáticamente. Tienes que indicarle a tu proyecto que cree el DataModule automáticamente, o si es necesario, crearlo tu mismo en algún evento.
Algo como:
|
Lo he hecho asi:
library prueba; { comentario borrado } uses Windows, SysUtils, Classes, Dialogs, udatos in 'udatos.pas' {Datos: TDataModule}; {$R *.res} function multiplica(a : integer; b : integer) : integer; stdcall; begin multiplica := a * b; end; function obtenerNombre(codigo : shortstring) : shortstring; stdcall; var temporal : shortstring; begin Application.CreateForm(datos, udatos); datos.consulta.ParamByName('codigo').AsInteger := strtoint(codigo); datos.consulta.Active := true; if datos.consulta.RecordCount = 0 then temporal := '-' else temporal := datos.consulta['pe_apelli']; datos.consulta.Active := false; obtenerNombre := temporal; end; exports multiplica, obtenerNombre; begin end. y me da un error en la linea que me has dicho que ponga. No me funciona. |
Algo de explicación conceptual
Hola,
Un DLL se maneja diferente a una aplicación. Cuando usas un TDataModule tanto la creación del mismo como su destrucción debes hacerlo por tí mismo. Digamos que agregastes una unidad en la que creates tú TDataModule; ten en cuenta que al hacerlo, en realidad lo que estás definiendo es una clase descendiente de TDataModule, a la que llamastes Datos. Tú unidad debe lucir algo como esto:
Lógicamente "Algo" es solo un ejemplo. Hay varias consideraciones de metodología a hacer. Sin entrar en detalles, es aconsable borrar el :
De la unidad que has creado, y en su lugar emplearlo como variable local de la rutina que deba usarla; esto es para facilitar programación multihilos en caso de que más adelante se desarrolle con ella. Las rutina que la use debe ser algo como esto:
El parámetro Nil del constructor le dice a la rutina que la responsabilidad de liberar al componente es de la propia rutina. Es importante que tengas en cuenta que aquí no puedas pasarle un parámetro Self, u otro componente, proveniente del programa principal porque se trata de áreas de memoria diferentes. Bueno, hay bastante teoría que podríamos anotar al respecto; pero espero que esto te ayude a orientarte. Ahora bien, te sugiero leer primero toda la teoría de manejo de DLLs y en especial la comunicación de parámetros entre el programa principal y el DLL, así como lo referente a manejo de memoria. |
Muchas gracias rolandoj. Me has aclarado un monton de dudas. Es que es la primera dll que creo en mi vida y la verdad es que ando un poco perdido.
Ha funcionado a la perfeccion. Muchas gracias de nuevo y un saludo. |
Me alegro. A la orden para cualquier otra cosa
Cita:
Me alegro que haya podido serte útil y quedo a la orden en caso de que necesites más ayuda. Este tema de los DLL tiene bastante detalles. Te podrás dar cuenta a medida que investigues al respecto. Muchos saludos |
La franja horaria es GMT +2. Ahora son las 18:21:39. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi