PDA

Ver la Versión Completa : Crear dll con acceso a base de datos


PaCmAn72
02-04-2008, 17:49:55
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.

ContraVeneno
02-04-2008, 18:05:35
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:

library TuDll;

uses
Windows,
...
Datamodule1 in '\\TuDll\Datamodule.pas' {DataModule1: TDataModule},
...

{$R *.RES}


begin
...
Application.CreateForm(TDatamodule1, Datamodule1);
...
end.

PaCmAn72
02-04-2008, 18:22:56
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.

rolandoj
03-04-2008, 00:45:27
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:


type
TDatos = class(TDataModule)
Private
FAlgo: Integer;
Public
Property Algo:Integer Read FAlgo Write FAlgo;
End;

Var
Datos: TDatos;


Lógicamente "Algo" es solo un ejemplo.

Hay varias consideraciones de metodología a hacer. Sin entrar en detalles, es aconsable borrar el :


Var
Datos: TDatos;


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:


Function HacerAlgo(ACode:Integer):Integer;
Var
Datos: TDatos;
Begin
Datos := Nil;
Try
Datos := TDatos.Create(Nil);
Datos.Algo := ACode;
....
HacerAlgo := Datos.Algo;
Finally
Datos.Free;
End;
End;


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.

PaCmAn72
03-04-2008, 10:01:59
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.

rolandoj
03-04-2008, 16:32:49
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.

Hola,

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