Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Crear dll con acceso a base de datos (https://www.clubdelphi.com/foros/showthread.php?t=54894)

PaCmAn72 02-04-2008 17:49:55

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.

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:
Código Delphi [-]
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

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:

Código Delphi [-]
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 :

Código Delphi [-]
 
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:

Código Delphi [-]
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

Me alegro. A la orden para cualquier otra cosa
 
Cita:

Empezado por PaCmAn72 (Mensaje 277234)
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


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